]> source.dussan.org Git - jquery.git/commitdiff
Continuing IE7 testing, conditional attr fixes and hooks with feature testing. Will...
authortimmywil <tim.willison@thisismedium.com>
Sat, 12 Mar 2011 02:28:42 +0000 (21:28 -0500)
committertimmywil <tim.willison@thisismedium.com>
Sun, 3 Apr 2011 23:13:39 +0000 (19:13 -0400)
src/attributes.js
src/core.js
src/support.js
test/unit/attributes.js

index 82ebe7279108300d6914dedeecf4f01ff1b0ce71..ad75a001d6cf6743fd8f643adbfaa81b39e3356e 100644 (file)
@@ -16,7 +16,7 @@ jQuery.fn.extend({
        removeAttr: function( name ) {
                return this.each(function() {
                        if ( this.nodeType === 1 ) {
-                               this.removeAttribute( name );
+                               jQuery.removeAttr( this, name );
                        }
                });
        },
@@ -287,68 +287,52 @@ jQuery.extend({
                if ( pass && name in jQuery.attrFn ) {
                        return jQuery(elem)[name](value);
                }
-        
+
                var ret,
                        notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
                        hooks;
-               
+
                // Normalize the name if needed
                name = notxml && jQuery.attrFix[ name ] || name;
-               
+
                hooks = jQuery.attrHooks[ name ];
-               
+
                if ( value !== undefined ) {
-                       
+
                        if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value )) !== undefined ) {
                                return ret;
-                       
+
                        } else if ( value === null ) {
-                               elem.removeAttribute( name );
+                               jQuery.removeAttr( elem, name );
                                return undefined;
-                               
+
                        } else {
-                               // convert the value to a string (all browsers do this but IE) see #1070
-                               value = "" + value;
                                elem.setAttribute( name, value );
                                return value;
                        }
-                       
+
                } else {
-                       
+
                        if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem )) !== undefined ) {
                                return ret;
-                               
-                       } else {
-
-                               if ( !jQuery.hasAttr( elem, name ) ) {
-                                       return undefined;
-                               }
 
+                       } else {
                                var attr = elem.getAttribute( name );
 
                                // Non-existent attributes return null, we normalize to undefined
-                               return attr === null || attr === "undefined" ? undefined : attr;
+                               return attr === null || attr === "undefined" || attr === "null" ? undefined : attr;
                        }
                }
        },
        
-       hasAttr: function( elem, name ) {
-
-               return elem.hasAttribute ?
-                       elem.hasAttribute( name ) :
-                       (function() {
-                               // Some browsers do not understand the associative indexes
-                               // Look for the name in elem.attributes.name
-                               var attrs = elem.attributes, i = 0, len = attrs.length;
-                               for ( ; i < len; i++ ) {
-                                       if ( attrs[i].name === name ) {
-                                               return true;
-                                       }
-                               }
-                               return false;
-                       })();
+       // removeAttribute returns boolean in IE6/7
+       // set property to null in that case
+       removeAttr: function( elem, name ) {
+               if ( typeof elem.removeAttribute( name ) === "boolean" ) {
+                       elem.setAttribute( name, null );
+               }
        },
-       
+
        attrHooks: {
                type: {
                        set: function( elem, value ) {
@@ -357,20 +341,6 @@ jQuery.extend({
                                        jQuery.error( "type property can't be changed" );
                                }
                        }
-               },
-               
-               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-               tabindex: {
-                       get: function( elem ) {
-                               var attributeNode = elem.getAttributeNode( "tabIndex" );
-
-                               return attributeNode && attributeNode.specified ?
-                                       attributeNode.value :
-                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                               0 :
-                                               undefined;
-                       }
                }
        },
        
@@ -414,20 +384,64 @@ jQuery.extend({
        propHooks: {}
 });
 
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !jQuery.support.getSetAttribute ) {
+       jQuery.attrFix = jQuery.extend( jQuery.attrFix, {
+               "for": "htmlFor",
+               "class": "className",
+               readonly: "readOnly",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               tabindex: "tabIndex",
+               usemap: "useMap",
+               frameborder: "frameBorder"
+       });
+
+       // Action attribute in ie6/7 returns form object
+       jQuery.attrHooks.action = jQuery.extend( jQuery.attrHooks.action, {
+               get: function( elem ) {
+                       return elem.nodeName === "FORM" ? elem.getAttributeNode("action").nodeValue : elem.getAttribute("action");
+               },
+               set: function( elem, value ) {
+                       elem.nodeName === "FORM" ? elem.getAttributeNode("action").nodeValue = value : elem.setAttribute("action", value);
+                       return value;
+               }
+       });
+}
+
 // Remove certain attrs if set to false
 jQuery.each([ "selected", "checked", "readonly", "disabled" ], function( i, name ) {
+       name = jQuery.attrFix[ name ] || name;
+       
        jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
                set: function( elem, value ) {
                        if ( !value ) { // '', undefined, false, null will remove attr
-                               elem.removeAttribute( name );
+                               jQuery.removeAttr( elem, name );
                                return false;
                        }
+
                        elem.setAttribute( name, value );
                        return value;
                }
        });
 });
 
+// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+jQuery.attrHooks[ jQuery.attrFix.tabindex || "tabindex" ] = {
+       get: function( elem ) {
+               var attributeNode = elem.getAttributeNode("tabIndex");
+
+               return attributeNode && attributeNode.specified ?
+                       parseInt( attributeNode.value, 10 ) :
+                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                               0 :
+                               undefined;
+       }
+};
+
 // Some attributes require a special call on IE
 if ( !jQuery.support.hrefNormalized ) {
        jQuery.each([ "href", "src", "style" ], function( i, name ) {
@@ -474,20 +488,4 @@ if ( !jQuery.support.optSelected ) {
        };
 }
 
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( jQuery.support.attrFix ) {
-       jQuery.extend( jQuery.attrFix, {
-               "for": "htmlFor",
-               "class": "className",
-               readonly: "readOnly",
-               maxlength: "maxLength",
-               cellspacing: "cellSpacing",
-               rowspan: "rowSpan",
-               colspan: "colSpan",
-               tabindex: "tabIndex",
-               usemap: "useMap",
-               frameborder: "frameBorder"
-       });
-}
-
 })( jQuery );
\ No newline at end of file
index 9312ee2889978aa3e3c8987a7d12df05f705953b..6b00a01513ee3c1deb6c63a1aff143cd001d4704 100644 (file)
@@ -894,4 +894,4 @@ function doScrollCheck() {
 // Expose jQuery to the global object
 return jQuery;
 
-})();
+})();
\ No newline at end of file
index ebda569f4d410228808e7d43ae897bdc032132f1..8e86c46cfbb28a832378d9ec6bf1c93de57c1a71 100644 (file)
@@ -59,7 +59,7 @@
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
                optSelected: opt.selected,
 
-               attrFix: div.className === "t",
+               getSetAttribute: div.className !== "t",
 
                // Will be defined later
                deleteExpando: true,
index af423e346530dafc41d4d97f70a9f54cc7bb62a7..d3293545587ca56abf41d48a4fcb35a492c5c3b6 100644 (file)
@@ -824,4 +824,4 @@ test("addClass, removeClass, hasClass", function() {
        ok( jq.hasClass("cla.ss3")==false, "Check the dotted class has been removed" );
        jq.removeClass("class4");
        ok( jq.hasClass("class4")==false, "Check the class has been properly removed" );
-});
+});
\ No newline at end of file