Skip to content
Permalink
Browse files

Found a problem removing the style attribute in IE

- Style is now a special case in IE6/7 to set cssText.  My goal is to avoid calling attr again for the performance benefit, and at this point it would also cause an infinite loop for the boolean attributes hooks such as selected & checked.  Nevertheless, style seems to be the only one requiring a special call.
  • Loading branch information
timmywil
timmywil committed Apr 3, 2011
1 parent 2a8a2b6 commit ad2b3bc9f908a8e529c4479c8c9baead23c2d827
Showing with 24 additions and 16 deletions.
  1. +15 −12 src/attributes.js
  2. +9 −4 test/unit/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);
@@ -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() {

0 comments on commit ad2b3bc

Please sign in to comment.
You can’t perform that action at this time.