Bug Tracker

Ticket #2548: attr.diff

File attr.diff, 3.4 KB (added by flesler, 4 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