diff --git a/src/attributes.js b/src/attributes.js index b472e617..ced9977e 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -276,7 +276,8 @@ jQuery.extend({ attrFix: { // Always normalize to ensure hook usage - tabindex: "tabIndex" + tabindex: "tabIndex", + readonly: "readOnly" }, attr: function( elem, name, value, pass ) { @@ -339,10 +340,14 @@ jQuery.extend({ if ( jQuery.support.getSetAttribute ) { elem.removeAttribute( name ); } else { - // Set to default empty string (No longer need to use attr for this) - elem.setAttribute( name, "" ); - // Attempt to remove completely with DOM level 1 - elem.removeAttributeNode( elem.getAttributeNode( name ) ); + // Only style is a special case. + if ( name === "style" ) { + elem.style.cssText = ""; + } else { + elem.setAttribute( name, "" ); + // Attempt to remove completely with DOM level 1 + elem.removeAttributeNode( elem.getAttributeNode( name ) ); + } } } }, @@ -415,7 +420,6 @@ if ( !jQuery.support.getSetAttribute ) { jQuery.attrFix = jQuery.extend( jQuery.attrFix, { "for": "htmlFor", "class": "className", - readonly: "readOnly", maxlength: "maxLength", cellspacing: "cellSpacing", rowspan: "rowSpan", @@ -447,12 +451,10 @@ if ( !jQuery.support.getSetAttribute ) { } // Remove certain attrs if set to false -jQuery.each([ "selected", "checked", "readonly", "disabled" ], function( i, name ) { - name = jQuery.attrFix[ name ] || name; - +jQuery.each([ "selected", "checked", "readOnly", "disabled" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { - if ( !value ) { // '', undefined, false, null will remove attr + if ( !value ) { jQuery.removeAttr( elem, name ); return false; } @@ -472,9 +474,10 @@ if ( !jQuery.support.hrefNormalized ) { } if ( !jQuery.support.style ) { - jQuery.propHooks.style = jQuery.attrHooks.style = { + jQuery.attrHooks.style = { get: function( elem ) { - return elem.style.cssText; + // Return undefined in the case of empty string + return elem.style.cssText || undefined; }, set: function( elem, value ) { return (elem.style.cssText = "" + value); diff --git a/test/unit/attributes.js b/test/unit/attributes.js index ad051649..0e86a8bf 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -15,9 +15,9 @@ test("jQuery.attrFix integrity test", function() { if ( !jQuery.support.getSetAttribute ) { propsShouldBe = { tabindex: "tabIndex", + readonly: "readOnly", "for": "htmlFor", "class": "className", - readonly: "readOnly", maxlength: "maxLength", cellspacing: "cellSpacing", rowspan: "rowSpan", @@ -27,7 +27,8 @@ test("jQuery.attrFix integrity test", function() { }; } else { propsShouldBe = { - tabindex: "tabIndex" + tabindex: "tabIndex", + readonly: "readOnly" }; } @@ -172,7 +173,7 @@ test("attr(Hash)", function() { }); test("attr(String, Object)", function() { - expect(29); + expect(30); var div = jQuery("div").attr("foo", "bar"), fail = false; @@ -195,6 +196,8 @@ test("attr(String, Object)", function() { equals( jQuery("#name").attr('name'), undefined, 'Remove name attribute' ); jQuery("#check2").attr('checked', true); equals( document.getElementById('check2').checked, true, 'Set checked attribute' ); + jQuery("#check2").attr('checked', ''); + equals( document.getElementById('check2').checked, false, 'Setting checked to empty string removes it' ); jQuery("#check2").attr('checked', false); equals( document.getElementById('check2').checked, false, 'Set checked attribute' ); jQuery("#text1").attr('readonly', true); @@ -397,9 +400,11 @@ test("attr('tabindex', value)", function() { }); test("removeAttr(String)", function() { - expect(2); + expect(4); equals( jQuery('#mark').removeAttr( "class" )[0].className, "", "remove class" ); equals( jQuery('#form').removeAttr('id').attr('id'), undefined, 'Remove id' ); + equals( jQuery('#foo').attr('style', 'position:absolute;').removeAttr('style').attr('style'), undefined, 'Check removing style attribute' ); + equals( jQuery('#form').attr('style', 'position:absolute;').removeAttr('style').attr('style'), undefined, 'Check removing style attribute on a form' ); }); test("removeProp(String)", function() {