X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Ftraversing.js;h=8f1e5eb5017b76dbdb6379b79be5eb8cd516b7e0;hb=c7006d2fa54ee66cc0fa413aabe157a0248673e0;hp=d78884798888157ef617dc4408e08c8c5f602f55;hpb=7c04a64016c1f295dfdf4e731f693f8400a987bc;p=jquery.git diff --git a/src/traversing.js b/src/traversing.js index d788847..8f1e5eb 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -1,3 +1,24 @@ +var winnow = function( elements, qualifier, keep ) { + if(jQuery.isFunction( qualifier )) { + return jQuery.grep(elements, function(elem, i) { + return !!qualifier.call( elem, i ) === keep; + }); + } else if( qualifier.nodeType ) { + return jQuery.grep(elements, function(elem, i) { + return (elem === qualifier) === keep; + }) + } else if( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function(elem) { return elem.nodeType === 1 }); + + if(isSimple.test( qualifier )) return jQuery.multiFilter(qualifier, filtered, !keep); + else qualifier = jQuery.multiFilter( qualifier, elements ); + } + + return jQuery.grep(elements, function(elem, i) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + jQuery.fn.extend({ find: function( selector ) { var ret = this.pushStack( "", "find", selector ), length = 0; @@ -22,25 +43,21 @@ jQuery.fn.extend({ return ret; }, + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + filter: function( selector ) { - return this.pushStack( - jQuery.isFunction( selector ) && - jQuery.grep(this, function(elem, i){ - return selector.call( elem, i ); - }) || - - jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ - return elem.nodeType === 1; - }) ), "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; return this.map(function(){ var cur = this; - while ( cur && cur.ownerDocument ) { + while ( cur && cur.ownerDocument && cur !== context ) { if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { jQuery.data(cur, "closest", closer); return cur; @@ -51,31 +68,29 @@ jQuery.fn.extend({ }); }, - not: function( selector ) { - if ( typeof selector === "string" ) - // test special case where just one selector is passed in - if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); - else - selector = jQuery.multiFilter( selector, this ); - - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; - return this.filter(function() { - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; - }); - }, - 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() { @@ -112,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; - return this.pushStack( jQuery.unique( ret ), name, selector ); + if ( name === "parents" && this.length > 1 ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, selector ); }; -}); \ No newline at end of file +});