diff options
author | jeresig <jeresig@gmail.com> | 2009-12-22 02:00:46 -0500 |
---|---|---|
committer | jeresig <jeresig@gmail.com> | 2009-12-22 02:00:46 -0500 |
commit | 1e64d581830f735999b60939eccf9bcdcb2e9ef9 (patch) | |
tree | b4e87926e761642434ee8c5d9ca03874811e08a9 | |
parent | 1b67aaee74c9b683ac31893b40077abd62e6d8c6 (diff) | |
download | jquery-1e64d581830f735999b60939eccf9bcdcb2e9ef9.tar.gz jquery-1e64d581830f735999b60939eccf9bcdcb2e9ef9.zip |
Make sure that the correct value is being pulled from checkboxes in Webkit. Fixes #5699.
-rw-r--r-- | src/attributes.js | 13 | ||||
-rw-r--r-- | src/support.js | 7 | ||||
-rw-r--r-- | test/unit/manipulation.js | 10 |
3 files changed, 24 insertions, 6 deletions
diff --git a/src/attributes.js b/src/attributes.js index 663d660f4..794da70ff 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -4,7 +4,8 @@ var rclass = /[\n\t]/g, rspecialurl = /href|src|style/, rtype = /(button|input)/i, rfocusable = /(button|input|object|select|textarea)/i, - rclickable = /^(a|area)$/i; + rclickable = /^(a|area)$/i, + rradiocheck = /radio|checkbox/; jQuery.fn.extend({ attr: function( name, value ) { @@ -127,6 +128,12 @@ jQuery.fn.extend({ return values; } + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value return (elem.value || "").replace(rreturn, ""); @@ -157,8 +164,8 @@ jQuery.fn.extend({ return; } - if ( jQuery.isArray(val) && /radio|checkbox/.test( this.type ) ) { - this.checked = jQuery.inArray( this.value, val ) >= 0; + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( jQuery(this).val(), val ) >= 0; } else if ( jQuery.nodeName( this, "select" ) ) { var values = jQuery.makeArray(val); diff --git a/src/support.js b/src/support.js index 71cf9db8e..976729828 100644 --- a/src/support.js +++ b/src/support.js @@ -8,7 +8,7 @@ id = "script" + now(); div.style.display = "none"; - div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><select><option>text</option></select>"; + div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><select><option>text</option></select><input type='checkbox'/>"; var all = div.getElementsByTagName("*"), a = div.getElementsByTagName("a")[0]; @@ -47,6 +47,11 @@ // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: div.getElementsByTagName("input")[0].value === "on", + // Will be defined later scriptEval: false, noCloneEvent: true, diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 0ebae1638..9242dddb5 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -619,7 +619,7 @@ test("clone() on XML nodes", function() { } test("val()", function() { - expect(15); + expect(17); document.getElementById('text1').value = "bla"; equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" ); @@ -648,10 +648,13 @@ test("val()", function() { var checks = jQuery("<input type='checkbox' name='test' value='1'/>").appendTo("#form") .add( jQuery("<input type='checkbox' name='test' value='2'/>").appendTo("#form") ) - .add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") ); + .add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") ) + .add( jQuery("<input type='checkbox' name='test'/>").appendTo("#form") ); same( checks.serialize(), "", "Get unchecked values." ); + equals( checks.eq(3).val(), "on", "Make sure a value of 'on' is provided if none is specified." ); + checks.val([ "2" ]); same( checks.serialize(), "test=2", "Get a single checked value." ); @@ -661,6 +664,9 @@ test("val()", function() { checks.val([ "", "2" ]); same( checks.serialize(), "test=2&test=", "Get multiple checked values." ); + checks.val([ "1", "on" ]); + same( checks.serialize(), "test=1&test=on", "Get multiple checked values." ); + checks.remove(); }); |