From 8533da939d933561aa6c516db4e544dba076a988 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 16 Feb 2009 17:58:33 +0000 Subject: [PATCH] Fixed an issue with :nth-child selectors embedded in :not() filters. Fixes jQuery bug #4156. --- src/selector.js | 40 ++++++++++++++++++++-------------------- test/unit/selector.js | 3 ++- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/selector.js b/src/selector.js index 69ea36c..505198b 100644 --- a/src/selector.js +++ b/src/selector.js @@ -422,7 +422,7 @@ var Expr = Sizzle.selectors = { } return false; } - } else if ( Expr.match.POS.test( match[0] ) ) { + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } @@ -519,6 +519,25 @@ var Expr = Sizzle.selectors = { } }, filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } + }, CHILD: function(elem, match){ var type = match[1], node = elem; switch (type) { @@ -562,25 +581,6 @@ var Expr = Sizzle.selectors = { } } }, - PSEUDO: function(elem, match, i, array){ - var name = match[1], filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; - } else if ( name === "not" ) { - var not = match[3]; - - for ( var i = 0, l = not.length; i < l; i++ ) { - if ( not[i] === elem ) { - return false; - } - } - - return true; - } - }, ID: function(elem, match){ return elem.nodeType === 1 && elem.getAttribute("id") === match; }, diff --git a/test/unit/selector.js b/test/unit/selector.js index 99cef57..9f29bf6 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -180,7 +180,7 @@ test("multiple", function() { }); test("child and adjacent", function() { - expect(48); + expect(49); t( "Child", "p > a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p> a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p >a", ["simon1","google","groups","mark","yahoo","simon"] ); @@ -211,6 +211,7 @@ test("child and adjacent", function() { t( "First Child", "p:first-child", ["firstp","sndp"] ); t( "Nth Child", "p:nth-child(1)", ["firstp","sndp"] ); + t( "Not Nth Child", "p:not(:nth-child(1))", ["ap","en","sap","first"] ); // Verify that the child position isn't being cached improperly jQuery("p:first-child").after("
"); -- 1.7.10.4