@@ -3,19 +3,22 @@ define([
33 "../core/access" ,
44 "./support" ,
55 "../var/rnotwhite" ,
6+ "./val" ,
67 "../selector"
78] , function ( jQuery , access , support , rnotwhite ) {
89
910var boolHook ,
10- attrHandle = jQuery . expr . attrHandle ;
11+ attrHandle = jQuery . expr . attrHandle ,
12+ ruseDefault = / ^ (?: c h e c k e d | s e l e c t e d ) $ / i,
13+ getSetInput = support . input ;
1114
1215jQuery . fn . extend ( {
1316 attr : function ( name , value ) {
1417 return access ( this , jQuery . attr , name , value , arguments . length > 1 ) ;
1518 } ,
1619
1720 removeAttr : function ( name ) {
18- return this . each ( function ( ) {
21+ return this . each ( function ( ) {
1922 jQuery . removeAttr ( this , name ) ;
2023 } ) ;
2124 }
@@ -74,6 +77,9 @@ jQuery.extend({
7477 set : function ( elem , value ) {
7578 if ( ! support . radioValue && value === "radio" &&
7679 jQuery . nodeName ( elem , "input" ) ) {
80+
81+ // Setting the type on a radio button after the value resets the value in IE8-9
82+ // Reset value to default in case type is set after value during creation
7783 var val = elem . value ;
7884 elem . setAttribute ( "type" , value ) ;
7985 if ( val ) {
@@ -98,7 +104,15 @@ jQuery.extend({
98104 if ( jQuery . expr . match . bool . test ( name ) ) {
99105
100106 // Set corresponding property to false
101- elem [ propName ] = false ;
107+ if ( getSetInput || ! ruseDefault . test ( name ) ) {
108+ elem [ propName ] = false ;
109+
110+ // Support: IE<9
111+ // Also clear defaultChecked/defaultSelected (if appropriate)
112+ } else {
113+ elem [ jQuery . camelCase ( "default-" + name ) ] =
114+ elem [ propName ] = false ;
115+ }
102116 }
103117
104118 elem . removeAttribute ( name ) ;
@@ -111,30 +125,77 @@ jQuery.extend({
111125boolHook = {
112126 set : function ( elem , value , name ) {
113127 if ( value === false ) {
128+
114129 // Remove boolean attributes when set to false
115130 jQuery . removeAttr ( elem , name ) ;
131+ } else if ( getSetInput || ! ruseDefault . test ( name ) ) {
132+ elem . setAttribute ( jQuery . propFix [ name ] || name , name ) ;
133+
116134 } else {
117- elem . setAttribute ( name , name ) ;
135+
136+ // Support: IE<9
137+ // Use defaultChecked and defaultSelected for oldIE
138+ elem [ jQuery . camelCase ( "default-" + name ) ] = elem [ name ] = true ;
118139 }
119140 return name ;
120141 }
121142} ;
143+
122144jQuery . each ( jQuery . expr . match . bool . source . match ( / \w + / g ) , function ( i , name ) {
123145 var getter = attrHandle [ name ] || jQuery . find . attr ;
124146
125- attrHandle [ name ] = function ( elem , name , isXML ) {
126- var ret , handle ;
127- if ( ! isXML ) {
128- // Avoid an infinite loop by temporarily removing this function from the getter
129- handle = attrHandle [ name ] ;
130- attrHandle [ name ] = ret ;
131- ret = getter ( elem , name , isXML ) != null ?
132- name . toLowerCase ( ) :
133- null ;
134- attrHandle [ name ] = handle ;
147+ if ( getSetInput || ! ruseDefault . test ( name ) ) {
148+ attrHandle [ name ] = function ( elem , name , isXML ) {
149+ var ret , handle ;
150+ if ( ! isXML ) {
151+
152+ // Avoid an infinite loop by temporarily removing this function from the getter
153+ handle = attrHandle [ name ] ;
154+ attrHandle [ name ] = ret ;
155+ ret = getter ( elem , name , isXML ) != null ?
156+ name . toLowerCase ( ) :
157+ null ;
158+ attrHandle [ name ] = handle ;
159+ }
160+ return ret ;
161+ } ;
162+ } else {
163+ attrHandle [ name ] = function ( elem , name , isXML ) {
164+ if ( ! isXML ) {
165+ return elem [ jQuery . camelCase ( "default-" + name ) ] ?
166+ name . toLowerCase ( ) :
167+ null ;
168+ }
169+ } ;
170+ }
171+ } ) ;
172+
173+ // fix oldIE attroperties
174+ if ( ! getSetInput ) {
175+ jQuery . attrHooks . value = {
176+ set : function ( elem , value ) {
177+ if ( jQuery . nodeName ( elem , "input" ) ) {
178+
179+ // Does not return so that setAttribute is also used
180+ elem . defaultValue = value ;
181+ }
135182 }
136- return ret ;
137183 } ;
138- } ) ;
184+ }
185+
186+ if ( ! support . style ) {
187+ jQuery . attrHooks . style = {
188+ get : function ( elem ) {
189+
190+ // Return undefined in the case of empty string
191+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
192+ // .cssText, that would destroy case sensitivity in URL's, like in "background"
193+ return elem . style . cssText || undefined ;
194+ } ,
195+ set : function ( elem , value ) {
196+ return ( elem . style . cssText = value + "" ) ;
197+ }
198+ } ;
199+ }
139200
140201} ) ;
0 commit comments