aboutsummaryrefslogtreecommitdiffstats
path: root/src/traversing.js
diff options
context:
space:
mode:
authorYehuda Katz <wycats@gmail.com>2009-07-16 07:32:11 +0000
committerYehuda Katz <wycats@gmail.com>2009-07-16 07:32:11 +0000
commit87869b8b81380617cfad8788799ee40de0e3e9c4 (patch)
tree812c3b231faf01c520c7df5e5b29d71e44e521f1 /src/traversing.js
parentc10f87120f6fb2c6c269e766d6988e9be946dd03 (diff)
downloadjquery-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.js49
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(),