]> source.dussan.org Git - jquery.git/commitdiff
Found a problem removing the style attribute in IE
authortimmywil <tim.willison@thisismedium.com>
Sun, 3 Apr 2011 22:18:32 +0000 (18:18 -0400)
committertimmywil <tim.willison@thisismedium.com>
Sun, 3 Apr 2011 23:13:41 +0000 (19:13 -0400)
- 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.

src/attributes.js
test/unit/attributes.js

index b472e617cfe516a4b7c753d543a69bb199501fe7..ced9977e4b4e61d3245eff9ac48efbe3fa4a1ef4 100644 (file)
@@ -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);
index ad051649fa50d8455243b1401d5169395cea95d5..0e86a8bf6780589174ee9c5ef461b5dbb475c65f 100644 (file)
@@ -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() {