diff options
author | timmywil <tim.willison@thisismedium.com> | 2011-05-07 14:49:04 -0400 |
---|---|---|
committer | timmywil <tim.willison@thisismedium.com> | 2011-05-07 14:49:04 -0400 |
commit | c08556327032daa21493f2b3a77f2138352fadf8 (patch) | |
tree | 0fbee4abe5b90104ea9bb8b7fed7c1d0b6effab4 /src | |
parent | 09c0cf995b84e0cff6d86c9f63bdad2b0440466a (diff) | |
download | jquery-c08556327032daa21493f2b3a77f2138352fadf8.tar.gz jquery-c08556327032daa21493f2b3a77f2138352fadf8.zip |
Reduce the boolean list only to those that have corresponding IDLs that don't require being added to propFix; only set the IDL if it exists
- See http://jsfiddle.net/timmywil/u5NLn/ for how boolean attributes are handled in every browser.
Diffstat (limited to 'src')
-rw-r--r-- | src/attributes.js | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/attributes.js b/src/attributes.js index 9326f69db..4d1644706 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -6,7 +6,7 @@ var rclass = /[\n\t\r]/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|declare|defer|disabled|draggable|formnovalidate|hidden|ismap|loop|multiple|muted|noresize|noshade|nowrap|novalidate|open|pubdate|readonly|required|reversed|scoped|seamless|selected|truespeed)$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, rinvalidChar = /\:/, formHook, boolHook; @@ -311,15 +311,15 @@ jQuery.extend({ hooks = jQuery.attrHooks[ name ]; if ( !hooks ) { - // Use formHook for forms and if the name contains certain characters - if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { - hooks = formHook; - // Use boolHook for boolean attributes - } else if ( rboolean.test( name ) && - (typeof value === "boolean" || value === undefined) ) { + if ( rboolean.test( name ) && + (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) { hooks = boolHook; + + // Use formHook for forms and if the name contains certain characters + } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { + hooks = formHook; } } @@ -352,6 +352,7 @@ jQuery.extend({ }, removeAttr: function( elem, name ) { + var propName; if ( elem.nodeType === 1 ) { name = jQuery.attrFix[ name ] || name; @@ -364,8 +365,8 @@ jQuery.extend({ } // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) ) { - elem[ jQuery.propFix[ name ] || name ] = false; + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; } } }, @@ -465,13 +466,19 @@ boolHook = { undefined; }, set: function( elem, value, name ) { + var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property - elem[ jQuery.propFix[ name ] || name ] = value; + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = value; + } + elem.setAttribute( name, name.toLowerCase() ); } return name; |