#8150 - When removing the width and height attributes in IE6/7, setting to "" actually sets to 0 instead of auto

- Having fixed this automatically with the use of removeAttribute in browsers that support it, this will fix it for IE6/7 as well.

- This has no effect on width/height styles set elsewhere( test added to removeAttr )

- With this addition, I need to call attr in removeAttr for IE6/7, which means boolean calls like .attr("checked", "") will no longer remove the attribute, which I think is fine.  .attr("checked", false) will still remove.  If I had left it, it would have gone in an infinite loop since setting to empty string is the only way to remove it in these browsers.

- The hrefNormalized hooks were returning null if they weren't present.  Added the null check to the getter.

- Now that the style support fails in IE8 as well due to uppercasing everything, no need to have style included with the hrefNormalized hooks
This commit is contained in:
timmywil 2011-04-09 17:25:06 -04:00
parent 17afd80d48
commit 3a1b4661f5
2 changed files with 26 additions and 17 deletions

View file

@ -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;
}
});
});