Transforming every simple class check into a regex? That sounds like a 
horribly roundabout way to do something extremely simple.
What happened to good old classic string testing? (" " + this.className 
+ " ").indexOf(" foo ");
A tiny bit of trickery, and that could be turned into a good possibility.

(" " + node.className.replace(/\s+/, " ") + " ").indexOf(" " + className 
+ " ");

~Daniel Friesen (Dantman, Nadir-Seen-Fire)

Julian Aubourg wrote:
> And gmail borked the sample page link :/
> http://www.tfuture.org/julian/classname.html
>
> 2009/3/27 Julian Aubourg <aubourg.jul...@gmail.com>
>
>   
>> So, I talked about making a plugin I would be the only one to use, didn't
>> I? ;)
>> http://www.tfuture.org/julian/jquery.classname.js
>>
>> The test page is here: 
>> http://www.tfuture.org/julian/classname.html<http://www.tfuture.org/julian/jquery.classname.js>
>>
>> (I borrowed a piece of internet from a friend)
>>
>> The plugin replaces jQuery.className and .hasClass(), .addClass(),
>> .removeClass(). It also adds .replaceClass(). The thing is, it enables
>> regexps so you can do something like .removeClass(/color\-.*/) and it will
>> work. I'm currently thinking about re-implementing .toggleClass() using the
>> same implementation trick.
>>
>> So anyway, what is the trick?
>>
>> Rather than splitting the classNames given AND the element.className, I
>> transform the classNames into a single regular expression that's
>> matched/used  onto element.className. The beauty of it is, using this
>> technique I can take regexps or strings as classNames, it just works. Also,
>> the regexp is computed only once per call to every xxxClass() method but
>> that's a trick that could be applied onto the current implementation.
>>
>> Now my real problem is that I try & get timings comparisons and I can't get
>> it right. Results change given the order in which you do the tests Oo. I
>> probably made a huge mistake in the way I handled my timers but it's like
>> 4am and an half here in Paris and my eyes just refuse to find the problem
>> (ANY HELP IS WELCOME ;) ).
>>
>> Sad about the timer thingy because at first glance it seemed to be a 20%
>> performance gain on a single node. I'm pretty confident that the new
>> implementations are at least on par with current ones (save from hasClass,
>> given it uses .is() actually) but I'd like to be sure.
>>
>> -- Julian
>>
>> 2009/3/26 Julian Aubourg <aubourg.jul...@gmail.com>
>>
>>     
>>> $(node).filter('.color-black').removeClass('color-black').addClass('color-white').end()
>>> And you find that more readable than
>>> $(node).replaceClass('color-black','color-white') ? ;)
>>>
>>> The main issue here is that I dunno what the class will be in the first
>>> place. I just know it will be "color-XXX" but I have no idea what the XXX
>>> is. All I have are clickable elements that basically say: "set backroung to
>>> red", "set background to green", etc etc. It could also be "set background
>>> to image1 and font-weight to bold" or anything else, the point is I'm not
>>> supposed to know the exact changes it is supposed to do visually to the
>>> targeted element (that's the whole point: keeping the style info in the css
>>> and use classes to switch the visual properties).
>>>
>>> So clearly, the first step is to find which of the color-XXX the element
>>> is tagged with, then replace it with color-YYY as asked by the other
>>> clickable element. So, yes, regexp support on hasClass / removeClass would
>>> be greatly appreciated (you don't wanna know how horrible my current code is
>>> -- basically relying on ids and a secondary structure to keep track of the
>>> actual color class -- hence duplicating the information).
>>>
>>> Now, onto the replaceClass. Well, node.removeClass(X).addClass(Y) is
>>> basically:
>>> - 1 split of X to arrayX
>>> - 1 split of Y to arrayY
>>> - (arrayX.length + arrayY.length) splits of the node's class attribute
>>> - (arrayX.length + arrayY.length) times searches in the resulting split
>>>
>>> On a side note, I don't even get why add and remove actually delegate to
>>> jQuery.classname.has() knowing the function does a split of the class
>>> attribute each time it is called rather then splitting the class attribute
>>> themselves and be done with it once and for all. It sure saves some bytes in
>>> the filesize department but it does not seem right to me from a performance
>>> point of view.
>>>
>>> Even if removeClass and addClass only did one split of the class attribute
>>> each, it would still be one split too many for a replacement.
>>>
>>> All I'm saying in the end is that a replaceClass() function would be
>>> simpler in usage and much more efficient (depending on the performance
>>> penalty of a regexped split) than chaining removeClass() and addClass().
>>>
>>> I guess that, today, most people do set style properties manually but
>>> class switching is so much more elegant, solid (since you don't have to keep
>>> track of which style properties were set previously so that you reset them
>>> before applying new ones) and efficient (you only change a string portion in
>>> an attribute and you don't have to go through jQuery's style engine). I'm
>>> just a bit puzzled jQuery makes it difficult by design in that it does not
>>> provide regexp support for class search and forces into an efficient
>>> solution to change a class for another.
>>>
>>> Probably nitpicking anyway but then again, I'm just telling because I have
>>> a real-life case on the table right now ;)
>>>
>>> Oh well, I guess it's time to make another plugin no-one will use apart
>>> from me ;)
>>>
>>> Thanks for the feedback, Dan,
>>>
>>> -- Julian
>>>
>>> 2009/3/26 Daniel Friesen <nadir.seen.f...@gmail.com>
>>>
>>>
>>>       
>>>> Having .hasClass / .removeClass support regex has been discussed before,
>>>> there is a ticket open for one of them so it might be a possibility.
>>>>
>>>> I don't see much use for replaceClass, rather I think the semantics of
>>>> reading it would be a little confusing. I can't even understand what the
>>>> code you have there is even supposed to do.
>>>> I see no reason to combine add and remove into one.
>>>>
>>>> Just a quick tip, if you're trying to do boolean stuff:
>>>>
>>>> $(node).filter('.color-black').removeClass('color-black').addClass('color-white').end()...
>>>> That there would replace color-black with color-white but only for nodes
>>>> with color-black, the .end() returns back to the original $(node) so
>>>> chaining can continue.
>>>>
>>>> ~Daniel Friesen (Dantman, Nadir-Seen-Fire)
>>>>
>>>> Julian Aubourg wrote:
>>>>         
>>>>> Hey all,
>>>>> I'm working on a site that offers some customizability regarding
>>>>>           
>>>> elements
>>>>         
>>>>> colors (background & font). Rather then setting the color with .css(),
>>>>>           
>>>> I use
>>>>         
>>>>> classes like color-red, color-green, etc (and of course, red is not the
>>>>>           
>>>> css
>>>>         
>>>>> "red" and green is not the css "green"). I find it much cleaner since
>>>>>           
>>>>  I
>>>>         
>>>>> need not have color values referenced within javascript or php (it's
>>>>>           
>>>> simply
>>>>         
>>>>> in the css).
>>>>>
>>>>> However, the code seems unnecessarily bloated for switching classes.
>>>>>           
>>>> What
>>>>         
>>>>> would be very useful imo, is to have hasClass accept regexp & return
>>>>>           
>>>> the
>>>>         
>>>>> array of found classes and also a .replaceClass() function that would
>>>>>           
>>>> change
>>>>         
>>>>> a class into another. That way I could do the following:
>>>>>
>>>>> var colorClasses = $.hasClass(/color-.+/);
>>>>> if (colorClasses!==false) {
>>>>>   var currentColorClass = colorClasses[0];
>>>>> }
>>>>> // Do stuff with the color class
>>>>> $.replaceClass(currentColorClass,"color-"+newColor);
>>>>>
>>>>> As of today, I have only two solutions:
>>>>> - keep the current color using $.data() or any other custom data
>>>>>           
>>>> container
>>>>         
>>>>> - OR search the class attribute by hand (hoping classes are in a
>>>>>           
>>>> specific
>>>>         
>>>>> order, you can imagine the mess)
>>>>>
>>>>> If that wasn't bad enough, after that, to replace the class, I have to
>>>>>           
>>>> call
>>>>         
>>>>> $.removeClass() and $.addClass() which seems pretty inefficient to me.
>>>>>
>>>>> I know I could probably do a plugin for that but I have the feeling
>>>>>           
>>>> that, if
>>>>         
>>>>> embedded in jQuery with its class related code, it would be much more
>>>>> efficient.
>>>>>
>>>>> I also know I could switch back to the .css("background-color",color)
>>>>>           
>>>> but it
>>>>         
>>>>> kinda defeats the purpose of having the presentation information in the
>>>>>           
>>>> css
>>>>         
>>>>> and ONLY in the css which I find pretty nice for maintenance.
>>>>>
>>>>> Yes, and finally, am I crazy or couldn't this be quite useful?
>>>>>
>>>>> Take care, all,
>>>>>
>>>>> -- Julian
>>>>>
>>>>>           
>>>>>           
>
> >
>
>   

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to jquery-dev@googlegroups.com
To unsubscribe from this group, send email to 
jquery-dev+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to