diff options
author | John Resig <jeresig@gmail.com> | 2009-02-16 18:23:59 +0000 |
---|---|---|
committer | John Resig <jeresig@gmail.com> | 2009-02-16 18:23:59 +0000 |
commit | 048fc4555f8a794239a985c63cff3f76d20d6c61 (patch) | |
tree | 25066a009b29c9c13f48f31ee2c65435d1e3c60c | |
parent | 8533da939d933561aa6c516db4e544dba076a988 (diff) | |
download | jquery-048fc4555f8a794239a985c63cff3f76d20d6c61.tar.gz jquery-048fc4555f8a794239a985c63cff3f76d20d6c61.zip |
Added support for class selectors and class attribute selectors on XML documents. Fixes jQuery bug #4167.
-rw-r--r-- | src/selector.js | 24 | ||||
-rw-r--r-- | test/data/test.js | 2 | ||||
-rw-r--r-- | test/data/test2.html | 2 | ||||
-rw-r--r-- | test/data/with_fries.xml | 2 | ||||
-rw-r--r-- | test/unit/selector.js | 4 |
5 files changed, 22 insertions, 12 deletions
diff --git a/src/selector.js b/src/selector.js index 505198b23..c97ba61ff 100644 --- a/src/selector.js +++ b/src/selector.js @@ -165,7 +165,8 @@ Sizzle.find = function(expr, context, isXML){ }; Sizzle.filter = function(expr, set, inplace, not){ - var old = expr, result = [], curLoop = set, match, anyFound; + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); while ( expr && set.length ) { for ( var type in Expr.filter ) { @@ -178,7 +179,7 @@ Sizzle.filter = function(expr, set, inplace, not){ } if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not ); + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; @@ -357,9 +358,13 @@ var Expr = Sizzle.selectors = { } }, preFilter: { - CLASS: function(match, curLoop, inplace, result, not){ + CLASS: function(match, curLoop, inplace, result, not, isXML){ match = " " + match[1].replace(/\\/g, "") + " "; + if ( isXML ) { + return match; + } + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { @@ -397,10 +402,10 @@ var Expr = Sizzle.selectors = { return match; }, - ATTR: function(match){ + ATTR: function(match, curLoop, inplace, result, not, isXML){ var name = match[1].replace(/\\/g, ""); - if ( Expr.attrMap[name] ) { + if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } @@ -588,7 +593,8 @@ var Expr = Sizzle.selectors = { return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; }, CLASS: function(elem, match){ - return match.test( elem.className ); + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; }, ATTR: function(elem, match){ var name = match[1], @@ -815,8 +821,10 @@ if ( document.getElementsByClassName && document.documentElement.getElementsByCl return; Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function(match, context) { - return context.getElementsByClassName(match[1]); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } }; })(); diff --git a/test/data/test.js b/test/data/test.js index 403d0d45d..a41cb232b 100644 --- a/test/data/test.js +++ b/test/data/test.js @@ -1,3 +1,3 @@ -foobar = "bar";
+var foobar = "bar";
jQuery('#ap').html('bar');
ok( true, "test.js executed");
diff --git a/test/data/test2.html b/test/data/test2.html index dec2b5d9f..1df6151a0 100644 --- a/test/data/test2.html +++ b/test/data/test2.html @@ -1,5 +1,5 @@ <script type="text/javascript"> -testFoo = "foo"; +var testFoo = "foo"; jQuery('#foo').html('foo'); ok( true, "test2.html executed" ); </script> diff --git a/test/data/with_fries.xml b/test/data/with_fries.xml index 88e0e49d5..42f425706 100644 --- a/test/data/with_fries.xml +++ b/test/data/with_fries.xml @@ -6,7 +6,7 @@ <jsconf xmlns="http://www.example.com/ns1"> <response xmlns:ab="http://www.example.com/ns2"> <meta> - <component id="seite1"> + <component id="seite1" class="component"> <properties xmlns:cd="http://www.example.com/ns3"> <property name="prop1"> <thing /> diff --git a/test/unit/selector.js b/test/unit/selector.js index 9f29bf6bf..c4c13601b 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -35,10 +35,12 @@ test("element", function() { if ( location.protocol != "file:" ) { test("XML Document Selectors", function() { - expect(5); + expect(7); stop(); jQuery.get("data/with_fries.xml", function(xml) { equals( jQuery("foo_bar", xml).length, 1, "Element Selector with underscore" ); + equals( jQuery(".component", xml).length, 1, "Class selector" ); + equals( jQuery("[class*=component]", xml).length, 1, "Attribute selector for class" ); equals( jQuery("property[name=prop2]", xml).length, 1, "Attribute selector with name" ); equals( jQuery("[name=prop2]", xml).length, 1, "Attribute selector with name" ); equals( jQuery("#seite1", xml).length, 1, "Attribute selector with ID" ); |