diff options
author | Yehuda Katz <wycats@gmail.com> | 2009-07-16 07:32:11 +0000 |
---|---|---|
committer | Yehuda Katz <wycats@gmail.com> | 2009-07-16 07:32:11 +0000 |
commit | 87869b8b81380617cfad8788799ee40de0e3e9c4 (patch) | |
tree | 812c3b231faf01c520c7df5e5b29d71e44e521f1 /src/traversing.js | |
parent | c10f87120f6fb2c6c269e766d6988e9be946dd03 (diff) | |
download | jquery-87869b8b81380617cfad8788799ee40de0e3e9c4.tar.gz jquery-87869b8b81380617cfad8788799ee40de0e3e9c4.zip |
Unify .not and .filter (resolves #4200).
- Both now support Function, Element, Selector, and Arrayish (including jQuery object)
Diffstat (limited to 'src/traversing.js')
-rw-r--r-- | src/traversing.js | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/src/traversing.js b/src/traversing.js index d78884798..669c70a50 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -1,3 +1,24 @@ +jQuery.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,16 +43,12 @@ jQuery.fn.extend({ return ret; }, + not: function( selector ) { + return this.pushStack( jQuery.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( jQuery.winnow(this, selector, true), "filter", selector ); }, closest: function( selector ) { @@ -51,20 +68,6 @@ 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(), |