Permalink
Browse files

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

Fixes gh-2732
Close gh-2840
1 parent fe05cf3 commit 780cac802b32a0125c467a644b3803be378ae6ab @timmywil timmywil committed Jan 15, 2016
Showing with 47 additions and 0 deletions.
  1. +16 −0 src/attributes/prop.js
  2. +31 −0 test/unit/attributes.js
@@ -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 ) {
jQuery.propHooks.selected = {
get: function( elem ) {
@@ -87,6 +93,16 @@ if ( !support.optSelected ) {
parent.parentNode.selectedIndex;
}
return null;
+ },
+ set: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
}
};
}
@@ -796,6 +796,37 @@ QUnit.test( "prop('tabindex', value)", function( assert ) {
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 ) {
assert.expect( 6 );
var attributeNode = document.createAttribute( "irrelevant" ),

0 comments on commit 780cac8

Please sign in to comment.