Fixed #1854 by using wizzud's suggestion. The only real difference is the code is only called when there is more than a single selector. So there should be no speed decrease in the current working cases. Only additional functionality for cases that used to fail.
This commit is contained in:
parent
3e3b86c7a7
commit
da33a981c6
5 changed files with 29 additions and 14 deletions
22
src/core.js
22
src/core.js
|
@ -342,15 +342,14 @@ jQuery.fn = jQuery.prototype = {
|
|||
},
|
||||
|
||||
not: function( selector ) {
|
||||
return this.pushStack(
|
||||
selector.constructor == String &&
|
||||
jQuery.multiFilter( selector, this, true ) ||
|
||||
if (selector.constructor == String)
|
||||
// test special case where just one selector is passed in
|
||||
if ( /^.[^:#\[\.]*$/.test(selector) )
|
||||
return this.pushStack( jQuery.multiFilter( selector, this, true ) );
|
||||
else
|
||||
selector = jQuery.multiFilter( selector, this );
|
||||
|
||||
jQuery.grep(this, function(elem) {
|
||||
return selector.constructor == Array || selector.jquery ?
|
||||
jQuery.inArray( elem, selector ) < 0 :
|
||||
elem != selector;
|
||||
}) );
|
||||
return this.pushStack( jQuery.removeFromArray( selector, this ) );
|
||||
},
|
||||
|
||||
add: function( selector ) {
|
||||
|
@ -1093,6 +1092,13 @@ jQuery.extend({
|
|||
return -1;
|
||||
},
|
||||
|
||||
removeFromArray: function( remove, from ) {
|
||||
var isArrayLike = remove.length && remove[remove.length - 1] !== undefined;
|
||||
return jQuery.grep(from, function(elem) {
|
||||
return isArrayLike ? jQuery.inArray( elem, remove ) < 0 : elem != from;
|
||||
});
|
||||
},
|
||||
|
||||
merge: function( first, second ) {
|
||||
// We have to loop this way because IE & Opera overwrite the length
|
||||
// expando of getElementsByTagName
|
||||
|
|
|
@ -320,7 +320,11 @@ jQuery.extend({
|
|||
// :not() is a special case that can be optimized by
|
||||
// keeping it out of the expression list
|
||||
if ( m[1] == ":" && m[2] == "not" )
|
||||
r = jQuery.filter(m[3], r, true).r;
|
||||
// optimize if only one selector found (most common case)
|
||||
if ( /^.[^:#\[\.]*$/.test(m[3]) )
|
||||
r = jQuery.filter(m[3], r, true).r;
|
||||
else
|
||||
r = jQuery.removeFromArray(jQuery.multiFilter(m[3], r), r);
|
||||
|
||||
// We can get a big speed boost by filtering by class here
|
||||
else if ( m[1] == "." )
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue