Sure.

Let's start with this:
    [].sort.apply( this, arguments )
'this' contains the current jQuery object, 'arguments' contains an
array of all the arguments passed in to the .sort() function.

jQuery Is a pseudo-array (not a true array) so it doesn't support
operations like .sort(), natively. To mimic this, we get the sort
function from a regular array:
    [].sort
and then call it within the context of our jQuery array using
JavaScript's apply method
    [].sort.apply( this, ... )
and pass in our arguments to it (which should be just a single
function, which is exactly what an array's sort function takes).

This whole mess returns a new array of DOM elements. Which brings us
to the rest:
    return this.pushStack( ..., []);
The pushStack function is part of jQuery, it allows it to keep a
stateful watch over what you match (it allows you to do .find() and
.end(), for example). In this case we want to make sure that .sort()
is stateful, since it's modifying the contents of the jQuery object.

The second argument to pushStack is normally the arguments array -
this is so that you can do stuff like:
    .filter(".foo",function(){ ... })
but in this case, we don't have a function to pass into .sort(), so we
just provide an empty array.

The result is a stateful way of sorting a set of DOM elements
contained within a jQuery object. It can be used like this:

$("div.items").sort(function(a,b){
    return a.innerHTML > b.innerHTML ? 1 : -1;
}).remove().appendTo("#itemlist");

Hope this helps.

--John

On 10/19/06, Stephen Woodbridge <[EMAIL PROTECTED]> wrote:
> Ok, I am just not worthy! <sigh>
> Somebody please walk me through how this plugin works.
>
> -Steve
>
> John Resig wrote:
> > Hi Erik -
> >
> > With your particular example, give this plugin a try:
> >
> > jQuery.fn.sort = function() {
> >   return this.pushStack( [].sort.apply( this, arguments ), []);
> > };
> >
> > We've been talking about adding this for a little while now, so it may
> > become official:
> > http://jquery.com/dev/bugs/bug/255/
> >
> > Using that plugin you can use your exact snippet, above. Let me know
> > if this helps.
> >
> > --John
> >
> >> I've been using jQuery for a month or so now and am really enjoying it!
> >>
> >> I haven't been able to figure out how to sort a collection of elements. I
> >> have something like the following:
> >>
> >> <div class="entry"><span class="foo">foo1</span><span
> >> class="bar">bar1</span></div
> >> <div class="entry"><span class="foo">foo2</span><span
> >> class="bar">bar2</span></div
> >>
> >> I would like to be able to do something like:
> >>
> >> $('.entry').sort(function(a, b) { return $('.foo', a).text()-$('.foo',
> >> b).text(); }).appendTo('#sortedStuff');
> >>
> >> Or something like that. I know javascript has a sort function, but that's
> >> for arrays, so I'm not sure how that will work with jQuery? Also, a google
> >> search for 'jquery sort' (no quotes), brings up some stuff about sorting in
> >> the jQuery code, but it appears old and I can't find anything about sorting
> >> in the latest release.
> >>
> >> Lastly, jQarray.js seems like it would do what I want, but it appears that
> >> site is gone (taking jXs with it, btw). It would be nice if plugins were
> >> cached on the jQuery site. Anybody have jQarray/jXs?
> >
> > _______________________________________________
> > jQuery mailing list
> > [email protected]
> > http://jquery.com/discuss/
>
>
> _______________________________________________
> jQuery mailing list
> [email protected]
> http://jquery.com/discuss/
>


-- 
John Resig
http://ejohn.org/
[EMAIL PROTECTED]

_______________________________________________
jQuery mailing list
[email protected]
http://jquery.com/discuss/

Reply via email to