diff --git a/src/attributes.js b/src/attributes.js index 15d4d50e..b4330a86 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -338,16 +338,11 @@ jQuery.extend({ name = jQuery.attrFix[ name ] || name; if ( jQuery.support.getSetAttribute ) { + // Use removeAttribute in browsers that support it elem.removeAttribute( name ); } else { - // 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 ) ); - } + jQuery.attr( elem, name, "" ); + elem.removeAttributeNode( elem.getAttributeNode( name ) ); } } }, @@ -448,15 +443,28 @@ if ( !jQuery.support.getSetAttribute ) { } } }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); } // Remove certain attrs if set to false jQuery.each([ "selected", "checked", "readOnly", "disabled" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { - if ( !value ) { + if ( value === false ) { jQuery.removeAttr( elem, name ); - return false; + return value; } } }); @@ -464,10 +472,11 @@ jQuery.each([ "selected", "checked", "readOnly", "disabled" ], function( i, name // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "style", "width", "height", "list" ], function( i, name ) { + jQuery.each([ "href", "src", "width", "height", "list" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { - return elem.getAttribute( name, 2 ); + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; } }); }); diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 3611b03e..fa30ff04 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -76,7 +76,7 @@ test("prop(String, Object)", function() { }); test("attr(String)", function() { - expect(31); + expect(32); equals( jQuery('#text1').attr('type'), "text", 'Check for type attribute' ); equals( jQuery('#radio1').attr('type'), "radio", 'Check for type attribute' ); @@ -90,6 +90,7 @@ test("attr(String)", function() { equals( jQuery('#text1').attr('name'), "action", 'Check for name attribute' ); ok( jQuery('#form').attr('action').indexOf("formaction") >= 0, 'Check for action attribute' ); equals( jQuery('#form').attr('blah', 'blah').attr('blah'), 'blah', 'Set non-existant attribute on a form' ); + equals( jQuery('#foo').attr('height'), undefined, 'Non existent height attribute should return undefined' ); // [7472] & [3113] (form contains an input with name="action" or name="id") var extras = jQuery('').appendTo('#testForm'); @@ -173,7 +174,7 @@ test("attr(Hash)", function() { }); test("attr(String, Object)", function() { - expect(30); + expect(29); var div = jQuery("div").attr("foo", "bar"), fail = false; @@ -196,8 +197,6 @@ 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); @@ -400,11 +399,12 @@ test("attr('tabindex', value)", function() { }); test("removeAttr(String)", function() { - expect(4); + expect(5); 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' ); + equals( jQuery('#fx-test-group').attr('height', '3px').removeAttr('height').css('height'), "1px", 'Removing height attribute has no effect on height set with style attribute' ); }); test("removeProp(String)", function() {