Fixed a bug with certain + selectors failing (Fixes jQuery bug #4023). Also tweaked...
authorJohn Resig <jeresig@gmail.com>
Mon, 16 Feb 2009 15:36:42 +0000 (15:36 +0000)
committerJohn Resig <jeresig@gmail.com>
Mon, 16 Feb 2009 15:36:42 +0000 (15:36 +0000)
src/selector.js
test/unit/selector.js

index 42e7e41..08dee27 100644 (file)
@@ -261,23 +261,32 @@ var Expr = Sizzle.selectors = {
        },
        relative: {
                "+": function(checkSet, part, isXML){
-                       var     isPartStr = typeof part === "string",
+                       var isPartStr = typeof part === "string",
                                isTag = isPartStr && !/\W/.test(part),
                                isPartStrNotTag = isPartStr && !isTag;
-                       if ( isTag && !isXML ) part = part.toUpperCase();
+
+                       if ( isTag && !isXML ) {
+                               part = part.toUpperCase();
+                       }
+
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-                               if ( elem = checkSet[i] ) {
-                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {};
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
-                                                elem : elem === part;
+                                               elem || false :
+                                               elem === part;
                                }
                        }
-                       if (isPartStrNotTag) {
+
+                       if ( isPartStrNotTag ) {
                                Sizzle.filter( part, checkSet, true );
                        }
                },
                ">": function(checkSet, part, isXML){
-                       if ( typeof part === "string" && !/\W/.test(part) ) {
+                       var isPartStr = typeof part === "string";
+
+                       if ( isPartStr && !/\W/.test(part) ) {
                                part = isXML ? part : part.toUpperCase();
 
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
@@ -291,13 +300,13 @@ var Expr = Sizzle.selectors = {
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
                                        var elem = checkSet[i];
                                        if ( elem ) {
-                                               checkSet[i] = typeof part === "string" ?
+                                               checkSet[i] = isPartStr ?
                                                        elem.parentNode :
                                                        elem.parentNode === part;
                                        }
                                }
 
-                               if ( typeof part === "string" ) {
+                               if ( isPartStr ) {
                                        Sizzle.filter( part, checkSet, true );
                                }
                        }
index 341d59b..f4b5b68 100644 (file)
@@ -180,7 +180,7 @@ test("multiple", function() {
 });
 
 test("child and adjacent", function() {
-       expect(45);
+       expect(48);
        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"] );
@@ -193,6 +193,9 @@ test("child and adjacent", function() {
        t( "Adjacent", "a+ a", ["groups"] );
        t( "Adjacent", "a+a", ["groups"] );
        t( "Adjacent", "p + p", ["ap","en","sap"] );
+       t( "Adjacent", "p#firstp + p", ["ap"] );
+       t( "Adjacent", "p[lang=en] + p", ["sap"] );
+       t( "Adjacent", "a.GROUPS + code + a", ["mark"] );
        t( "Comma, Child, and Adjacent", "a + a, code > a", ["groups","anchor1","anchor2"] );
 
        t( "Verify deep class selector", "div.blah > p > a", [] );