X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Ftraversing.js;h=8f1e5eb5017b76dbdb6379b79be5eb8cd516b7e0;hb=67d445a703491c90a7d3c46be34bcdceb4d1c896;hp=e8a89387d3ac6c660e501e3231f810519b1e6936;hpb=cae93c39eb57ccc2acc5e101eda7a56e0a734cdf;p=jquery.git diff --git a/src/traversing.js b/src/traversing.js index e8a8938..8f1e5eb 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -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 ); }; });