From 1886d7443453feab0b73f4a7c4b15fbd9401c4af Mon Sep 17 00:00:00 2001 From: timmywil Date: Sat, 9 Jul 2011 14:41:58 -0400 Subject: [PATCH] Check the attribute node value for false for HTML5 booleans when not supported. Fixes #9504. --- src/attributes.js | 4 +++- test/unit/attributes.js | 23 +++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index 1e0e79f4b..cbd9561eb 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -496,7 +496,9 @@ jQuery.extend({ boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties - return jQuery.prop( elem, name ) ? + // Fall back to attribute presence where some booleans are not supported + var attrNode; + return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 4716e5b53..b0fe2b4aa 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -162,7 +162,7 @@ test("attr(Hash)", function() { }); test("attr(String, Object)", function() { - expect(69); + expect(73); var div = jQuery("div").attr("foo", "bar"), fail = false; @@ -230,13 +230,20 @@ test("attr(String, Object)", function() { jQuery("#name").attr("maxLength", "10"); equals( document.getElementById("name").maxLength, 10, "Set maxlength attribute" ); - var $text = jQuery("#text1").attr("autofocus", true); - if ( "autofocus" in $text[0] ) { - equals( $text.attr("autofocus"), "autofocus", "Set boolean attributes to the same name"); - } else { - equals( $text.attr("autofocus"), undefined, "autofocus stays undefined in browsers that do not support it(F<4)"); - } - equals( $text.attr("autofocus", false).attr("autofocus"), undefined, "Setting autofocus attribute to false removes it"); + // HTML5 boolean attributes + var $text = jQuery("#text1").attr({ + "autofocus": true, + "required": true + }); + equal( $text.attr("autofocus"), "autofocus", "Set boolean attributes to the same name" ); + equal( $text.attr("autofocus", false).attr("autofocus"), undefined, "Setting autofocus attribute to false removes it" ); + equal( $text.attr("required"), "required", "Set boolean attributes to the same name" ); + equal( $text.attr("required", false).attr("required"), undefined, "Setting required attribute to false removes it" ); + + var $details = jQuery("
").appendTo("#qunit-fixture"); + equal( $details.attr("open"), "open", "open attribute presense indicates true" ); + equal( $details.attr("open", false).attr("open"), undefined, "Setting open attribute to false removes it" ); + equals( $text.attr("data-something", true).data("something"), true, "Setting data attributes are not affected by boolean settings"); equals( $text.attr("data-another", false).data("another"), false, "Setting data attributes are not affected by boolean settings" ); equals( $text.attr("aria-disabled", false).attr("aria-disabled"), "false", "Setting aria attributes are not affected by boolean settings"); -- 2.39.5