From: John Resig Date: Wed, 21 Jan 2009 23:19:30 +0000 (+0000) Subject: Make sure that [name=foo] and #id selectors don't use the native methods on XML docum... X-Git-Url: http://git.asbjorn.it/?a=commitdiff_plain;h=7d9d2105406fe7fcdc196df860ca155c3e4c8453;p=jquery.git Make sure that [name=foo] and #id selectors don't use the native methods on XML documents (since id and name attributes may not be defined by a DTD and will return nothing instead. Fixes jQuery bug #3945. --- diff --git a/src/selector.js b/src/selector.js index 6a629bd..a250746 100644 --- a/src/selector.js +++ b/src/selector.js @@ -55,7 +55,7 @@ var Sizzle = function(selector, context, results, seed) { } else { var ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context ); + Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) ); set = Sizzle.filter( ret.expr, ret.set ); if ( parts.length > 0 ) { @@ -120,7 +120,7 @@ Sizzle.matches = function(expr, set){ return Sizzle(expr, null, null, set); }; -Sizzle.find = function(expr, context){ +Sizzle.find = function(expr, context, isXML){ var set, match; if ( !expr ) { @@ -135,7 +135,7 @@ Sizzle.find = function(expr, context){ if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace(/\\/g, ""); - set = Expr.find[ type ]( match, context ); + set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; @@ -315,14 +315,16 @@ var Expr = Sizzle.selectors = { } }, find: { - ID: function(match, context){ - if ( context.getElementById ) { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? [m] : []; } }, - NAME: function(match, context){ - return context.getElementsByName ? context.getElementsByName(match[1]) : null; + NAME: function(match, context, isXML){ + if ( typeof context.getElementsByName !== "undefined" && !isXML ) { + return context.getElementsByName(match[1]); + } }, TAG: function(match, context){ return context.getElementsByTagName(match[1]); diff --git a/test/unit/selector.js b/test/unit/selector.js index 0b2a328..07671c6 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -21,11 +21,15 @@ test("element", function() { }); if ( location.protocol != "file:" ) { - test("Element Selector with underscore", function() { - expect(1); + test("XML Document Selectors", function() { + expect(5); stop(); jQuery.get("data/with_fries.xml", function(xml) { equals( jQuery("foo_bar", xml).length, 1, "Element Selector with underscore" ); + 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 name" ); + equals( jQuery("component#seite1", xml).length, 1, "Attribute selector with name" ); start(); }); });