},
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;
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") ) {