From 1e64d581830f735999b60939eccf9bcdcb2e9ef9 Mon Sep 17 00:00:00 2001 From: jeresig Date: Tue, 22 Dec 2009 02:00:46 -0500 Subject: [PATCH] Make sure that the correct value is being pulled from checkboxes in Webkit. Fixes #5699. --- src/attributes.js | 13 ++++++++++--- src/support.js | 7 ++++++- test/unit/manipulation.js | 10 ++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index 663d660..794da70 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 71cf9db..9767298 100644 --- a/src/support.js +++ b/src/support.js @@ -8,7 +8,7 @@ id = "script" + now(); div.style.display = "none"; - div.innerHTML = "
a"; + div.innerHTML = "
a"; 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 0ebae16..9242ddd 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("").appendTo("#form") .add( jQuery("").appendTo("#form") ) - .add( jQuery("").appendTo("#form") ); + .add( jQuery("").appendTo("#form") ) + .add( jQuery("").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(); }); -- 1.7.10.4