Bug Tracker

Ticket #2548: attr.diff

File attr.diff, 3.4 kB (added by flesler, 10 months 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