From 34d80709ce9bd583f6f5dd17e9bffa2fb7cff3c5 Mon Sep 17 00:00:00 2001 From: timmywil Date: Sun, 17 Apr 2011 18:15:20 -0400 Subject: [PATCH] Fix value attribute and val for value on button elements. Fixes #1954 --- src/attributes.js | 6 +++--- test/unit/attributes.js | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index 374196e1..794b98d7 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -158,7 +158,7 @@ jQuery.fn.extend({ if ( elem ) { hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - if ( hooks && "get" in hooks && (ret = hooks.get( elem )) !== undefined ) { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } @@ -197,7 +197,7 @@ jQuery.fn.extend({ hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; // If set returns undefined, fall back to normal setting - if ( !hooks || ("set" in hooks && hooks.set( this, val ) === undefined) ) { + if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) { this.value = val; } }); @@ -433,7 +433,7 @@ if ( !jQuery.support.getSetAttribute ) { // Use this for any attribute on a form in IE6/7 // And the name attribute - formHook = jQuery.attrHooks.name = { + formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = { get: function( elem, name ) { var ret = elem.getAttributeNode( name ); // Return undefined if not specified instead of empty string diff --git a/test/unit/attributes.js b/test/unit/attributes.js index a497effa..80ccf71a 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -77,7 +77,7 @@ test("prop(String, Object)", function() { }); test("attr(String)", function() { - expect(32); + expect(34); equals( jQuery("#text1").attr("type"), "text", "Check for type attribute" ); equals( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" ); @@ -136,6 +136,11 @@ test("attr(String)", function() { ok( !!~jQuery("#dl").attr("style").indexOf("position"), "Check style attribute getter, also normalize css props to lowercase" ); ok( !!~jQuery("#foo").attr("style", "position:absolute;").attr("style").indexOf("position"), "Check style setter" ); + // Check value on button element (#1954) + var $button = jQuery("").insertAfter("#button"); + equals( $button.attr("value"), "foobar", "Value retrieval on a button does not return innerHTML" ); + equals( $button.attr("value", "baz").html(), "text", "Setting the value does not change innerHTML" ); + ok( jQuery("
").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." ); ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." ); }); @@ -426,7 +431,7 @@ test("removeProp(String)", function() { }); test("val()", function() { - expect(23); + expect(25); document.getElementById("text1").value = "bla"; equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" ); @@ -488,6 +493,10 @@ test("val()", function() { same( checks.serialize(), "test=1&test=on", "Get multiple checked values." ); checks.remove(); + + var $button = jQuery("").insertAfter("#button"); + equals( $button.val(), "foobar", "Value retrieval on a button does not return innerHTML" ); + equals( $button.val("baz").html(), "text", "Setting the value does not change innerHTML" ); }); var testVal = function(valueObj) {