Don't have .val() return selected-but-disabled options, or selected options inside...
authorDave Methvin <dave.methvin@gmail.com>
Fri, 24 Sep 2010 21:26:22 +0000 (17:26 -0400)
committerjeresig <jeresig@gmail.com>
Fri, 24 Sep 2010 21:26:22 +0000 (17:26 -0400)
src/attributes.js
test/index.html
test/unit/attributes.js
test/unit/event.js
test/unit/selector.js
test/unit/traversing.js

index 73dee36..a76695b 100644 (file)
@@ -163,8 +163,10 @@ jQuery.fn.extend({
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
                                                var option = options[ i ];
 
-                                               if ( option.selected ) {
-                                                       // Get the specifc value for the option
+                                               // Don't return options that are disabled or in a disabled optgroup
+                                               if ( option.selected && !option.disabled && 
+                                                               (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+                                                       // Get the specific value for the option
                                                        value = jQuery(option).val();
 
                                                        // We don't need an array for one selects
index 78060d4..5650a1d 100644 (file)
                                <option id="option3d" value="3">3</option>
                                <option id="option3e">no value</option>
                        </select>
+                       <select name="select4" id="select4" multiple="multiple">
+                               <optgroup disabled="disabled">
+                                       <option id="option4a" class="emptyopt" value="">Nothing</option>
+                                       <option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
+                                       <option id="option4c" selected="selected" value="2">2</option>
+                               </optgroup>
+                               <option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
+                               <option id="option4e">no value</option>
+                       </select>
                        
                        <object id="object1" codebase="stupid">
                                <param name="p1" value="x1" />
index 0372721..986623b 100644 (file)
@@ -302,7 +302,7 @@ test("removeAttr(String)", function() {
 });
 
 test("val()", function() {
-       expect(17);
+       expect(20);
 
        document.getElementById('text1').value = "bla";
        equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
@@ -329,6 +329,14 @@ test("val()", function() {
        jQuery('#select3').val("");
        same( jQuery('#select3').val(), [''], 'Call val() on a multiple="multiple" select' );
 
+       same( jQuery('#select4').val(), [], 'Call val() on multiple="multiple" select with all disabled options' );
+
+       jQuery('#select4 optgroup').add('#select4 > [disabled]').attr('disabled', false);
+       same( jQuery('#select4').val(), ['2', '3'], 'Call val() on multiple="multiple" select with some disabled options' );
+
+       jQuery('#select4').attr('disabled', true);
+       same( jQuery('#select4').val(), ['2', '3'], 'Call val() on disabled multiple="multiple" select' );
+
        var checks = jQuery("<input type='checkbox' name='test' value='1'/><input type='checkbox' name='test' value='2'/><input type='checkbox' name='test' value=''/><input type='checkbox' name='test'/>").appendTo("#form");
 
        same( checks.serialize(), "", "Get unchecked values." );
index 3032497..3c77e34 100644 (file)
@@ -255,7 +255,7 @@ test("bind(), iframes", function() {
 });
 
 test("bind(), trigger change on select", function() {
-       expect(3);
+       expect(4);
        var counter = 0;
        function selectOnChange(event) {
                equals( event.data, counter++, "Event.data is not a global event object" );
index 58ae68d..97fc689 100644 (file)
@@ -21,7 +21,7 @@ test("element", function() {
        same( jQuery("p", jQuery("div")).get(), q("firstp","ap","sndp","en","sap","first"), "Finding elements with a context." );
        same( jQuery("div").find("p").get(), q("firstp","ap","sndp","en","sap","first"), "Finding elements with a context." );
 
-       same( jQuery("#form").find("select").get(), q("select1","select2","select3"), "Finding selects with a context." );
+       same( jQuery("#form").find("select").get(), q("select1","select2","select3","select4"), "Finding selects with a context." );
        
        ok( jQuery("#length").length, '&lt;input name="length"&gt; cannot be found under IE, see #945' );
        ok( jQuery("#lengthtest input").length, '&lt;input name="length"&gt; cannot be found under IE, see #945' );
@@ -338,7 +338,7 @@ test("pseudo - :not", function() {
        expect(24);
        t( "Not", "a.blog:not(.link)", ["mark"] );
 
-       t( "Not - multiple", "#form option:not(:contains(Nothing),#option1b,:selected)", ["option1c", "option1d", "option2b", "option2c", "option3d", "option3e"] );
+       t( "Not - multiple", "#form option:not(:contains(Nothing),#option1b,:selected)", ["option1c", "option1d", "option2b", "option2c", "option3d", "option3e", "option4e"] );
        t( "Not - recursive", "#form option:not(:not(:selected))[id^='option3']", [ "option3b", "option3c"] );
 
        t( ":not() failing interior", "p:not(.foo)", ["firstp","ap","sndp","en","sap","first"] );
@@ -360,8 +360,8 @@ test("pseudo - :not", function() {
        t( "No element not selector", ".container div:not(.excluded) div", [] );
 
        t( ":not() Existing attribute", "#form select:not([multiple])", ["select1", "select2"]);
-       t( ":not() Equals attribute", "#form select:not([name=select1])", ["select2", "select3"]);
-       t( ":not() Equals quoted attribute", "#form select:not([name='select1'])", ["select2", "select3"]);
+       t( ":not() Equals attribute", "#form select:not([name=select1])", ["select2", "select3", "select4"]);
+       t( ":not() Equals quoted attribute", "#form select:not([name='select1'])", ["select2", "select3", "select4"]);
 
        t( ":not() Multiple Class", "#foo a:not(.blog)", ["yahoo","anchor2"] );
        t( ":not() Multiple Class", "#foo a:not(.link)", ["yahoo","anchor2"] );
@@ -427,7 +427,7 @@ test("pseudo - visibility", function() {
 test("pseudo - form", function() {
        expect(8);
 
-       t( "Form element :input", "#form :input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "search", "button", "area1", "select1", "select2", "select3"] );
+       t( "Form element :input", "#form :input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "search", "button", "area1", "select1", "select2", "select3", "select4"] );
        t( "Form element :radio", "#form :radio", ["radio1", "radio2"] );
        t( "Form element :checkbox", "#form :checkbox", ["check1", "check2"] );
        t( "Form element :text", "#form :text:not(#search)", ["text1", "text2", "hidden2", "name"] );
@@ -435,5 +435,5 @@ test("pseudo - form", function() {
        t( "Form element :checkbox:checked", "#form :checkbox:checked", ["check1"] );
        t( "Form element :radio:checked, :checkbox:checked", "#form :radio:checked, #form :checkbox:checked", ["radio2", "check1"] );
 
-       t( "Selected Option Element", "#form option:selected", ["option1a","option2d","option3b","option3c"] );
+       t( "Selected Option Element", "#form option:selected", ["option1a","option2d","option3b","option3c","option4b","option4c","option4d"] );
 });
index 179e130..4233f70 100644 (file)
@@ -152,7 +152,7 @@ test("not(Selector)", function() {
        equals( jQuery("#main > p#ap > a").not("#google").length, 2, "not('selector')" );
        same( jQuery("p").not(".result").get(), q("firstp", "ap", "sndp", "en", "sap", "first"), "not('.class')" );
        same( jQuery("p").not("#ap, #sndp, .result").get(), q("firstp", "en", "sap", "first"), "not('selector, selector')" );
-       same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e" ), "not('complex selector')");
+       same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e", "option4e" ), "not('complex selector')");
 
        same( jQuery('#ap *').not('code').get(), q("google", "groups", "anchor1", "mark"), "not('tag selector')" );
        same( jQuery('#ap *').not('code, #mark').get(), q("google", "groups", "anchor1"), "not('tag, ID selector')" );
@@ -163,7 +163,7 @@ test("not(Element)", function() {
        expect(1);
 
        var selects = jQuery("#form select");
-       same( selects.not( selects[1] ).get(), q("select1", "select3"), "filter out DOM element");
+       same( selects.not( selects[1] ).get(), q("select1", "select3", "select4"), "filter out DOM element");
 });
 
 test("not(Function)", function() {