]> source.dussan.org Git - jquery.git/commitdiff
Traversing: Let .not(arraylike) pass non-element nodes
authorDave Methvin <dave.methvin@gmail.com>
Tue, 2 Aug 2016 20:41:34 +0000 (16:41 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Wed, 10 Aug 2016 14:04:24 +0000 (10:04 -0400)
Fixes gh-3226
Closes gh-3261

src/traversing/findFilter.js
test/unit/traversing.js

index 92d6753b4e8761c4970ae5a848f44414376cf752..3bd036a18a079d5fad9bcca820f49eb331443bbd 100644 (file)
@@ -15,24 +15,29 @@ function winnow( elements, qualifier, not ) {
                return jQuery.grep( elements, function( elem, i ) {
                        return !!qualifier.call( elem, i, elem ) !== not;
                } );
-
        }
 
+       // Single element
        if ( qualifier.nodeType ) {
                return jQuery.grep( elements, function( elem ) {
                        return ( elem === qualifier ) !== not;
                } );
-
        }
 
-       if ( typeof qualifier === "string" ) {
-               if ( risSimple.test( qualifier ) ) {
-                       return jQuery.filter( qualifier, elements, not );
-               }
+       // Arraylike of elements (jQuery, arguments, Array)
+       if ( typeof qualifier !== "string" ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+               } );
+       }
 
-               qualifier = jQuery.filter( qualifier, elements );
+       // Simple selector that can be filtered directly, removing non-Elements
+       if ( risSimple.test( qualifier ) ) {
+               return jQuery.filter( qualifier, elements, not );
        }
 
+       // Complex selector, compare the two sets, removing non-Elements
+       qualifier = jQuery.filter( qualifier, elements );
        return jQuery.grep( elements, function( elem ) {
                return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
        } );
index 74da6d9730b5e041ffc98ef5bff2bf736677eb1a..c7ed01415ebfa2f805f9b60ffad00b72302363a1 100644 (file)
@@ -481,6 +481,20 @@ QUnit.test( "not(Selector) excludes non-element nodes (gh-2808)", function( asse
        assert.deepEqual( mixedContents.not( "[id=a],*,[id=b]" ).get(), [], "not [id=a],*,[id=b]" );
 } );
 
+QUnit.test( "not(arraylike) passes non-element nodes (gh-3226)", function( assert ) {
+       assert.expect( 5 );
+
+       var mixedContents = jQuery( "<span id='nonnodesElement'>hi</span> there <!-- mon ami -->" ),
+               mixedLength = mixedContents.length,
+               firstElement = mixedContents.first();
+
+       assert.deepEqual( mixedContents.not( mixedContents ).get(), [], "not everything" );
+       assert.deepEqual( mixedContents.not( firstElement ).length, mixedLength - 1, "not firstElement" );
+       assert.deepEqual( mixedContents.not( [ firstElement[ 0 ].nextSibling ] ).length, mixedLength - 1, "not textnode array" );
+       assert.deepEqual( mixedContents.not( firstElement[ 0 ].nextSibling ).length, mixedLength - 1, "not textnode" );
+       assert.deepEqual( mixedContents.not( document.body ).get(), mixedContents.get(), "not with unmatched element" );
+} );
+
 QUnit.test( "has(Element)", function( assert ) {
        assert.expect( 3 );
        var obj, detached, multipleParent;