Bug Tracker

Ticket #2548: attr.diff

File attr.diff, 3.4 KB (added by flesler, 14 years ago)

Proposal

  • src/core.js

     
    174174                // Look for the case where we're accessing a style value
    175175                if ( name.constructor == String )
    176176                        if ( value == undefined )
    177                                 return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined;
     177                                return this[0] && jQuery[ type || "attr" ]( this[0], name );
    178178
    179179                        else {
    180180                                options = {};
     
    10421042        attr: function( elem, name, value ) {
    10431043                // don't set attributes on text and comment nodes
    10441044                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
    1045                         return undefined;
     1045                        return;
    10461046
    10471047                var fix = jQuery.isXMLDoc( elem ) ?
    10481048                        {} :
    1049                         jQuery.props;
     1049                        jQuery.props,
     1050                        get = value != undefined,//whether we are getting (or setting)
     1051                        special = /href|src/.test( name );//these attributes need special treatment
    10501052
    10511053                // Safari mis-reports the default selected property of a hidden option
    10521054                // Accessing the parent's selectedIndex property fixes it
     
    10541056                        elem.parentNode.selectedIndex;
    10551057               
    10561058                // Certain attributes only work when accessed via the old DOM 0 way
    1057                 if ( fix[ name ] ) {
    1058                         if ( value != undefined )
    1059                                 elem[ fix[ name ] ] = value;
     1059                if ( !special && ( fix[ name ] || name in elem ) ) {
     1060                        if ( get )
     1061                                elem[ fix[ name ] || name ] = value;
    10601062
    1061                         return elem[ fix[ name ] ];
     1063                        return elem[ fix[ name ] || name ];
    10621064
    10631065                } else if ( jQuery.browser.msie && name == "style" )
    10641066                        return jQuery.attr( elem.style, "cssText", value );
    10651067
    1066                 else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") )
     1068                else if ( get && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") )
    10671069                        return elem.getAttributeNode( name ).nodeValue;
    10681070
    10691071                // IE elem.getAttribute passes even for style
    10701072                else if ( elem.tagName ) {
    10711073
    1072                         if ( value != undefined ) {
     1074                        if ( get ) {
    10731075                                // We can't allow the type property to be changed (since it causes problems in IE)
    10741076                                if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
    10751077                                        throw "type property can't be changed";
     
    10781080                                elem.setAttribute( name, "" + value );
    10791081                        }
    10801082
    1081                         if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) )
     1083                        if ( jQuery.browser.msie && special && !jQuery.isXMLDoc( elem ) )
    10821084                                return elem.getAttribute( name, 2 );
    10831085
    10841086                        return elem.getAttribute( name );
     
    10871089                } else {
    10881090                        // IE actually uses filters for opacity
    10891091                        if ( name == "opacity" && jQuery.browser.msie ) {
    1090                                 if ( value != undefined ) {
     1092                                if ( get ) {
    10911093                                        // IE has trouble with opacity if it does not have layout
    10921094                                        // Force it by setting the zoom level
    10931095                                        elem.zoom = 1;
     
    11061108                                return letter.toUpperCase();
    11071109                        });
    11081110
    1109                         if ( value != undefined )
     1111                        if ( get )
    11101112                                elem[ name ] = value;
    11111113
    11121114                        return elem[ name ];
     
    12341236                "float": styleFloat,
    12351237                cssFloat: styleFloat,
    12361238                styleFloat: styleFloat,
    1237                 innerHTML: "innerHTML",
    1238                 className: "className",
    1239                 value: "value",
    1240                 disabled: "disabled",
    1241                 checked: "checked",
    12421239                readonly: "readOnly",
    1243                 selected: "selected",
    1244                 maxlength: "maxLength",
    1245                 selectedIndex: "selectedIndex",
    1246                 defaultValue: "defaultValue",
    1247                 tagName: "tagName",
    1248                 nodeName: "nodeName"
     1240                maxlength: "maxLength"
    12491241        }
    12501242});
    12511243