]> source.dussan.org Git - jquery.git/commitdiff
Fix #13514: Set selectedIndex to -1 when non-matching value is set on a select. Close...
authorruado1987 <ruado1987@gmail.com>
Sun, 3 Mar 2013 15:51:04 +0000 (23:51 +0800)
committerRichard Gibson <richard.gibson@gmail.com>
Fri, 22 Mar 2013 16:47:01 +0000 (12:47 -0400)
(cherry picked from commit 48d71d0c3e53d1bb1688fc6c0593b008ced3403b)

src/attributes.js
test/unit/attributes.js

index c9e7dbc47ebe53390e354dc91c1ef15046ff2d36..37addf4a2007e76f4abc5a413e8f698bda4d3523 100644 (file)
@@ -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;
index 7d0366b9004abee23735a451880366809baa2093..5996ce15c88ed8b2461dab502a29db852836fef7 100644 (file)
@@ -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") ) {