diff options
-rw-r--r-- | src/attributes.js | 21 | ||||
-rw-r--r-- | test/unit/attributes.js | 16 |
2 files changed, 30 insertions, 7 deletions
diff --git a/src/attributes.js b/src/attributes.js index c9e7dbc47..37addf4a2 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -272,13 +272,20 @@ jQuery.extend({ }, set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { elem.selectedIndex = -1; } return values; diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 7d0366b90..5996ce15c 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -846,6 +846,22 @@ test( "val()", function() { equal( jQuery("<option/>").val("test").attr("value"), "test", "Setting value sets the value attribute" ); }); +test("val() with non-matching values on dropdown list", function() { + expect( 3 ); + + jQuery("#select5").val( "" ); + equal( jQuery("#select5").val(), null, "Non-matching set on select-one" ); + + var select6 = jQuery("<select multiple id=\"select6\"><option value=\"1\">A</option><option value=\"2\">B</option></select>").appendTo("#form"); + jQuery(select6).val( "nothing" ); + equal( jQuery(select6).val(), null, "Non-matching set (single value) on select-multiple" ); + + jQuery(select6).val( ["nothing1", "nothing2"] ); + equal( jQuery(select6).val(), null, "Non-matching set (array of values) on select-multiple" ); + + select6.remove(); +}); + if ( "value" in document.createElement("meter") && "value" in document.createElement("progress") ) { |