]> source.dussan.org Git - jquery.git/commitdiff
Landing pull request 491. Fix #7322. Make `.is()` with a positional selector work...
authorDave Methvin <dave.methvin@gmail.com>
Tue, 20 Sep 2011 03:50:52 +0000 (23:50 -0400)
committertimmywil <timmywillisn@gmail.com>
Tue, 20 Sep 2011 03:50:52 +0000 (23:50 -0400)
More Details:
 - https://github.com/jquery/jquery/pull/491
 - http://bugs.jquery.com/ticket/7322

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

index 35a5174e9fffcc8134de6813cc41169312e6bb64..fa9462216786513f2e4c490200ec5a0bd6bba692 100644 (file)
@@ -73,9 +73,14 @@ jQuery.fn.extend({
        },
 
        is: function( selector ) {
-               return !!selector && ( typeof selector === "string" ?
-                       jQuery.filter( selector, this ).length > 0 :
-                       this.filter( selector ).length > 0 );
+               return !!selector && ( 
+                       typeof selector === "string" ?
+                               // If this is a positional selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               POS.test( selector ) ? 
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
        },
 
        closest: function( selectors, context ) {
index 1c415c02e8d8dc5f73d42b0166e86aca04edc2c6..a3050672bdf6712755d1b0293dd88681abb109dc 100644 (file)
@@ -101,6 +101,46 @@ test("is(jQuery)", function() {
        ok( !jQuery("#simon").is( jQuery(".blogTest")[0] ), "Check for multiple classes: Expected classes 'blog' and 'link', but not 'blogTest'" );
 });
 
+test("is() with positional selectors", function() {
+       expect(23);
+       
+       var html = jQuery( 
+                               '<p id="posp"><a class="firsta" href="#"><em>first</em></a><a class="seconda" href="#"><b>test</b></a><em></em></p>' 
+                       ).appendTo( "body" ),
+               isit = function(sel, match, expect) {
+                       equal( jQuery( sel ).is( match ), expect, "jQuery( " + sel + " ).is( " + match + " )" );
+               };
+
+       isit( "#posp", "#posp:first", true );
+       isit( "#posp", "#posp:eq(2)", false );
+       isit( "#posp", "#posp a:first", false );
+
+       isit( "#posp .firsta", "#posp a:first", true );
+       isit( "#posp .firsta", "#posp a:last", false );
+       isit( "#posp .firsta", "#posp a:even", true );
+       isit( "#posp .firsta", "#posp a:odd", false );
+       isit( "#posp .firsta", "#posp a:eq(0)", true );
+       isit( "#posp .firsta", "#posp a:eq(9)", false );
+       isit( "#posp .firsta", "#posp em:eq(0)", false );
+       isit( "#posp .firsta", "#posp em:first", false );
+       isit( "#posp .firsta", "#posp:first", false );
+
+       isit( "#posp .seconda", "#posp a:first", false );
+       isit( "#posp .seconda", "#posp a:last", true );
+       isit( "#posp .seconda", "#posp a:gt(0)", true );
+       isit( "#posp .seconda", "#posp a:lt(5)", true );
+       isit( "#posp .seconda", "#posp a:lt(1)", false );
+
+       isit( "#posp em", "#posp a:eq(0) em", true );
+       isit( "#posp em", "#posp a:lt(1) em", true );
+       isit( "#posp em", "#posp a:gt(1) em", false );
+       isit( "#posp em", "#posp a:first em", true );
+       isit( "#posp em", "#posp a em:last", true );
+       isit( "#posp em", "#posp a em:eq(2)", false );
+
+       html.remove();
+});
+
 test("index()", function() {
        expect( 2 );