@@ -3,19 +3,22 @@ define([
3
3
"../core/access" ,
4
4
"./support" ,
5
5
"../var/rnotwhite" ,
6
+ "./val" ,
6
7
"../selector"
7
8
] , function ( jQuery , access , support , rnotwhite ) {
8
9
9
10
var 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 ;
11
14
12
15
jQuery . fn . extend ( {
13
16
attr : function ( name , value ) {
14
17
return access ( this , jQuery . attr , name , value , arguments . length > 1 ) ;
15
18
} ,
16
19
17
20
removeAttr : function ( name ) {
18
- return this . each ( function ( ) {
21
+ return this . each ( function ( ) {
19
22
jQuery . removeAttr ( this , name ) ;
20
23
} ) ;
21
24
}
@@ -74,6 +77,9 @@ jQuery.extend({
74
77
set : function ( elem , value ) {
75
78
if ( ! support . radioValue && value === "radio" &&
76
79
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
77
83
var val = elem . value ;
78
84
elem . setAttribute ( "type" , value ) ;
79
85
if ( val ) {
@@ -98,7 +104,15 @@ jQuery.extend({
98
104
if ( jQuery . expr . match . bool . test ( name ) ) {
99
105
100
106
// 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
+ }
102
116
}
103
117
104
118
elem . removeAttribute ( name ) ;
@@ -111,30 +125,77 @@ jQuery.extend({
111
125
boolHook = {
112
126
set : function ( elem , value , name ) {
113
127
if ( value === false ) {
128
+
114
129
// Remove boolean attributes when set to false
115
130
jQuery . removeAttr ( elem , name ) ;
131
+ } else if ( getSetInput || ! ruseDefault . test ( name ) ) {
132
+ elem . setAttribute ( jQuery . propFix [ name ] || name , name ) ;
133
+
116
134
} 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 ;
118
139
}
119
140
return name ;
120
141
}
121
142
} ;
143
+
122
144
jQuery . each ( jQuery . expr . match . bool . source . match ( / \w + / g ) , function ( i , name ) {
123
145
var getter = attrHandle [ name ] || jQuery . find . attr ;
124
146
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
+ }
135
182
}
136
- return ret ;
137
183
} ;
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
+ }
139
200
140
201
} ) ;
0 commit comments