Added support for class selectors and class attribute selectors on XML documents...
authorJohn Resig <jeresig@gmail.com>
Mon, 16 Feb 2009 18:23:59 +0000 (18:23 +0000)
committerJohn Resig <jeresig@gmail.com>
Mon, 16 Feb 2009 18:23:59 +0000 (18:23 +0000)
src/selector.js
test/data/test.js
test/data/test2.html
test/data/with_fries.xml
test/unit/selector.js

index 505198b..c97ba61 100644 (file)
@@ -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]);
+               }
        };
 })();
 
index 403d0d4..a41cb23 100644 (file)
@@ -1,3 +1,3 @@
-foobar = "bar";\r
+var foobar = "bar";\r
 jQuery('#ap').html('bar');\r
 ok( true, "test.js executed");\r
index dec2b5d..1df6151 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">
-testFoo = "foo";
+var testFoo = "foo";
 jQuery('#foo').html('foo');
 ok( true, "test2.html executed" );
 </script>
index 88e0e49..42f4257 100644 (file)
@@ -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 />
index 9f29bf6..c4c1360 100644 (file)
@@ -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" );