diff --git a/src/selector.js b/src/selector.js index 3dc87659f..7c0bf4082 100644 --- a/src/selector.js +++ b/src/selector.js @@ -564,7 +564,16 @@ var Expr = Sizzle.selectors = { return match.test( elem.className ); }, ATTR: function(elem, match){ - var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4]; + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + return result == null ? type === "!=" : type === "=" ? @@ -574,7 +583,7 @@ var Expr = Sizzle.selectors = { type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? - result : + value && result !== false : type === "!=" ? value != check : type === "^=" ? diff --git a/test/unit/selector.js b/test/unit/selector.js index 4c63a7a19..924f41d0e 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -215,7 +215,7 @@ test("child and adjacent", function() { }); test("attributes", function() { - expect(37); + expect(40); t( "Attribute Exists", "a[title]", ["google"] ); t( "Attribute Exists", "*[title]", ["google"] ); t( "Attribute Exists", "[title]", ["google"] ); @@ -233,6 +233,13 @@ test("attributes", function() { t( "for Attribute", "form label[for]", ["label-for"] ); t( "for Attribute in form", "#form [for=action]", ["label-for"] ); + + jQuery("form input")[0].test = 0; + jQuery("form input")[1].test = 1; + + t( "Expando attribute", "form input[test]", ["text1", "text2"] ); + t( "Expando attribute value", "form input[test=0]", ["text1"] ); + t( "Expando attribute value", "form input[test=1]", ["text2"] ); t( "Attribute containing []", "input[name^='foo[']", ["hidden2"] ); t( "Attribute containing []", "input[name^='foo[bar]']", ["hidden2"] );