Attributes: fix setting selected on an option in IE<=11

Fixes gh-2732
Close gh-2840
This commit is contained in:
Timmy Willison 2016-01-15 16:48:52 -05:00
parent fe05cf37ff
commit 780cac802b
2 changed files with 47 additions and 0 deletions

View File

@ -79,6 +79,12 @@ jQuery.extend( {
} }
} ); } );
// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
if ( !support.optSelected ) { if ( !support.optSelected ) {
jQuery.propHooks.selected = { jQuery.propHooks.selected = {
get: function( elem ) { get: function( elem ) {
@ -87,6 +93,16 @@ if ( !support.optSelected ) {
parent.parentNode.selectedIndex; parent.parentNode.selectedIndex;
} }
return null; return null;
},
set: function( elem ) {
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
if ( parent && parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
} }
}; };
} }

View File

@ -796,6 +796,37 @@ QUnit.test( "prop('tabindex', value)", function( assert ) {
assert.equal( clone[ 0 ].getAttribute( "tabindex" ), "1", "set tabindex on cloned element" ); assert.equal( clone[ 0 ].getAttribute( "tabindex" ), "1", "set tabindex on cloned element" );
} ); } );
QUnit.test( "option.prop('selected', true) affects select.selectedIndex (gh-2732)", function( assert ) {
assert.expect( 2 );
function addOptions( $elem ) {
return $elem.append(
jQuery( "<option/>" ).val( "a" ).text( "One" ),
jQuery( "<option/>" ).val( "b" ).text( "Two" ),
jQuery( "<option/>" ).val( "c" ).text( "Three" )
)
.find( "[value=a]" ).prop( "selected", true ).end()
.find( "[value=c]" ).prop( "selected", true ).end();
}
var $optgroup,
$select = jQuery( "<select/>" );
// Check select with options
addOptions( $select ).appendTo( "#qunit-fixture" );
$select.find( "[value=b]" ).prop( "selected", true );
assert.equal( $select[ 0 ].selectedIndex, 1, "Setting option selected affects selectedIndex" );
$select.empty();
// Check select with optgroup
$optgroup = jQuery( "<optgroup/>" );
addOptions( $optgroup ).appendTo( $select );
$select.find( "[value=b]" ).prop( "selected", true );
assert.equal( $select[ 0 ].selectedIndex, 1, "Setting option in optgroup selected affects selectedIndex" );
} );
QUnit.test( "removeProp(String)", function( assert ) { QUnit.test( "removeProp(String)", function( assert ) {
assert.expect( 6 ); assert.expect( 6 );
var attributeNode = document.createAttribute( "irrelevant" ), var attributeNode = document.createAttribute( "irrelevant" ),