Skip to content

Commit f2bcf87

Browse files
pgiladmarkelog
authored andcommitted
Attributes: fix IE8 issues
Follow-up for d0388e9
1 parent d0388e9 commit f2bcf87

File tree

2 files changed

+105
-24
lines changed

2 files changed

+105
-24
lines changed

src/attributes/attr.js

+77-16
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,22 @@ define([
33
"../core/access",
44
"./support",
55
"../var/rnotwhite",
6+
"./val",
67
"../selector"
78
], function( jQuery, access, support, rnotwhite ) {
89

910
var boolHook,
10-
attrHandle = jQuery.expr.attrHandle;
11+
attrHandle = jQuery.expr.attrHandle,
12+
ruseDefault = /^(?:checked|selected)$/i,
13+
getSetInput = support.input;
1114

1215
jQuery.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({
111125
boolHook = {
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+
122144
jQuery.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
});

src/attributes/prop.js

+28-8
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,22 @@ define([
55
"../selector"
66
], function( jQuery, access, support ) {
77

8-
var rfocusable = /^(?:input|select|textarea|button)$/i;
8+
var rfocusable = /^(?:input|select|textarea|button|object)$/i,
9+
rclickable = /^(?:a|area)$/i;
910

1011
jQuery.fn.extend({
1112
prop: function( name, value ) {
1213
return access( this, jQuery.prop, name, value, arguments.length > 1 );
1314
},
1415

1516
removeProp: function( name ) {
17+
name = jQuery.propFix[ name ] || name;
1618
return this.each(function() {
17-
delete this[ jQuery.propFix[ name ] || name ];
19+
// try/catch handles cases where IE balks (such as removing a property on window)
20+
try {
21+
this[ name ] = undefined;
22+
delete this[ name ];
23+
} catch ( e ) {}
1824
});
1925
}
2026
});
@@ -55,10 +61,18 @@ jQuery.extend({
5561
propHooks: {
5662
tabIndex: {
5763
get: function( elem ) {
58-
return elem.hasAttribute( "tabindex" ) ||
59-
rfocusable.test( elem.nodeName ) || elem.href ?
60-
elem.tabIndex :
61-
-1;
64+
// elem.tabIndex doesn't always return the
65+
// correct value when it hasn't been explicitly set
66+
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
67+
// Use proper attribute retrieval(#12072)
68+
var tabindex = jQuery.find.attr( elem, "tabindex" );
69+
70+
return tabindex ?
71+
parseInt( tabindex, 10 ) :
72+
rfocusable.test( elem.nodeName ) ||
73+
rclickable.test( elem.nodeName ) && elem.href ?
74+
0 :
75+
-1;
6276
}
6377
}
6478
},
@@ -73,8 +87,14 @@ if ( !support.optSelected ) {
7387
jQuery.propHooks.selected = {
7488
get: function( elem ) {
7589
var parent = elem.parentNode;
76-
if ( parent && parent.parentNode ) {
77-
parent.parentNode.selectedIndex;
90+
91+
if ( parent ) {
92+
parent.selectedIndex;
93+
94+
// Make sure that it also works with optgroups, see #5701
95+
if ( parent.parentNode ) {
96+
parent.parentNode.selectedIndex;
97+
}
7898
}
7999
return null;
80100
}

0 commit comments

Comments
 (0)