A follow-up to [6578] (which stopped adding expandos to elements that didn't have...
[jquery.git] / src / traversing.js
index e8a8938..8f1e5eb 100644 (file)
@@ -1,4 +1,4 @@
-jQuery.winnow = function( elements, qualifier, keep ) {
+var winnow = function( elements, qualifier, keep ) {
        if(jQuery.isFunction( qualifier )) {
                return jQuery.grep(elements, function(elem, i) {
                        return !!qualifier.call( elem, i ) === keep;
@@ -44,17 +44,16 @@ jQuery.fn.extend({
        },
 
        not: function( selector ) {
-               return this.pushStack( jQuery.winnow(this, selector, false), "not", selector);
+               return this.pushStack( winnow(this, selector, false), "not", selector);
        },
 
        filter: function( selector ) {
-               return this.pushStack( jQuery.winnow(this, selector, true), "filter", selector );
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
        },
 
-       closest: function( selector ) {
+       closest: function( selector, context ) {
                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
-                       closer = 0,
-                       context = this.context;
+                       closer = 0;
 
                return this.map(function(){
                        var cur = this;
@@ -70,16 +69,28 @@ jQuery.fn.extend({
        },
 
        add: function( selector ) {
-               return this.pushStack( jQuery.unique( jQuery.merge(
-                       this.get(),
-                       typeof selector === "string" ?
+               var set = typeof selector === "string" ?
                                jQuery( selector ) :
-                               jQuery.makeArray( selector )
-               )));
+                               jQuery.makeArray( selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( set[0] && (set[0].setInterval || set[0].nodeType === 9 || (set[0].parentNode && set[0].parentNode.nodeType !== 11)) ?
+                       jQuery.unique( all ) :
+                       all );
        },
 
        eq: function( i ) {
-               return this.slice( i, +i + 1 );
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, +i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
        },
 
        slice: function() {
@@ -116,9 +127,16 @@ jQuery.each({
        jQuery.fn[ name ] = function( selector ) {
                var ret = jQuery.map( this, fn );
 
-               if ( selector && typeof selector == "string" )
+               if ( selector && typeof selector === "string" ) {
                        ret = jQuery.multiFilter( selector, ret );
+               }
+
+               ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+               if ( name === "parents" && this.length > 1 ) {
+                       ret = ret.reverse();
+               }
 
-               return this.pushStack( jQuery.unique( ret ), name, selector );
+               return this.pushStack( ret, name, selector );
        };
 });