]> source.dussan.org Git - jquery.git/commitdiff
Attributes: Refactor val(): don't strip carriage return, isolate IE workarounds
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 13 Jan 2020 18:25:01 +0000 (19:25 +0100)
committerGitHub <noreply@github.com>
Mon, 13 Jan 2020 18:25:01 +0000 (19:25 +0100)
Before this change, `val()` was stripping out carriage return characters from
the returned value. No test has relied on that. The logic was different for
option elements as its custom defined hook was omitting this stripping logic.

This commit gets rid of the carriage return removal and isolates the IE-only
select val getter to be skipped in other browsers.

Closes gh-4585

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

index 38e170ba8ae0dc1a6eb94ed784b8dde7243a8b59..f200f97eedabfcd55c2b822c514c2b9789569c24 100644 (file)
@@ -1,11 +1,10 @@
 import jQuery from "../core.js";
+import isIE from "../var/isIE.js";
 import stripAndCollapse from "../core/stripAndCollapse.js";
 import nodeName from "../core/nodeName.js";
 
 import "../core/init.js";
 
-var rreturn = /\r/g;
-
 jQuery.fn.extend( {
        val: function( value ) {
                var hooks, ret, valueIsFunction,
@@ -25,11 +24,6 @@ jQuery.fn.extend( {
 
                                ret = elem.value;
 
-                               // Handle most common string cases
-                               if ( typeof ret === "string" ) {
-                                       return ret.replace( rreturn, "" );
-                               }
-
                                // Handle cases where value is null/undef or number
                                return ret == null ? "" : ret;
                        }
@@ -77,20 +71,6 @@ jQuery.fn.extend( {
 
 jQuery.extend( {
        valHooks: {
-               option: {
-                       get: function( elem ) {
-
-                               var val = elem.getAttribute( "value" );
-                               return val != null ?
-                                       val :
-
-                                       // Support: IE <=10 - 11+
-                                       // option.text throws exceptions (#14686, #14858)
-                                       // Strip and collapse whitespace
-                                       // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-                                       stripAndCollapse( jQuery.text( elem ) );
-                       }
-               },
                select: {
                        get: function( elem ) {
                                var value, option, i,
@@ -144,7 +124,7 @@ jQuery.extend( {
                                        option = options[ i ];
 
                                        if ( ( option.selected =
-                                               jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+                                               jQuery.inArray( jQuery( option ).val(), values ) > -1
                                        ) ) {
                                                optionSet = true;
                                        }
@@ -160,6 +140,23 @@ jQuery.extend( {
        }
 } );
 
+if ( isIE ) {
+       jQuery.valHooks.option = {
+               get: function( elem ) {
+
+                       var val = elem.getAttribute( "value" );
+                       return val != null ?
+                               val :
+
+                               // Support: IE <=10 - 11+
+                               // option.text throws exceptions (#14686, #14858)
+                               // Strip and collapse whitespace
+                               // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+                               stripAndCollapse( jQuery.text( elem ) );
+               }
+       };
+}
+
 // Radios and checkboxes getter/setter
 jQuery.each( [ "radio", "checkbox" ], function() {
        jQuery.valHooks[ this ] = {
index 386aadaf365e5d4cd9e822a932e4a546ff75f27c..d592314a01b1ca9f085f680edcd78167aad700d0 100644 (file)
@@ -1196,6 +1196,57 @@ QUnit.test( "select.val(space characters) (gh-2978)", function( assert ) {
        } );
 } );
 
+QUnit.test( "radio.val(space characters)", function( assert ) {
+       assert.expect( 42 );
+
+       var radio = jQuery( "<input type='radio'/>" ).appendTo( "#qunit-fixture" ),
+               spaces = {
+                       "\\t": {
+                               html: "&#09;",
+                               val: "\t"
+                       },
+                       "\\n": {
+                               html: "&#10;",
+                               val: "\n"
+                       },
+                       "\\r": {
+                               html: "&#13;",
+                               val: "\r"
+                       },
+                       "\\f": "\f",
+                       "space": " ",
+                       "\\u00a0": "\u00a0",
+                       "\\u1680": "\u1680"
+               };
+
+       jQuery.each( spaces, function( key, obj ) {
+               var val = obj.val || obj;
+
+               radio.val( "attr" + val );
+               assert.equal( radio.val(), "attr" + val, "Value ending with space character (" + key + ") returned (set via val())" );
+
+               radio.val( "at" + val + "tr" );
+               assert.equal( radio.val(), "at" + val + "tr", "Value with space character (" + key + ") in the middle returned (set via val())" );
+
+               radio.val( val + "attr" );
+               assert.equal( radio.val(), val + "attr", "Value starting with space character (" + key + ") returned (set via val())" );
+       } );
+
+       jQuery.each( spaces, function( key, obj ) {
+               var val = obj.val || obj,
+                       htmlVal = obj.html || obj;
+
+               radio = jQuery( "<input type='radio' value='attr" + htmlVal + "'/>" ).appendTo( "#qunit-fixture" );
+               assert.equal( radio.val(), "attr" + val, "Value ending with space character (" + key + ") returned (set via HTML)" );
+
+               radio = jQuery( "<input type='radio' value='at" + htmlVal + "tr'/>" ).appendTo( "#qunit-fixture" );
+               assert.equal( radio.val(), "at" + val + "tr", "Value with space character (" + key + ") in the middle returned (set via HTML)" );
+
+               radio = jQuery( "<input type='radio' value='" + htmlVal + "attr'/>" ).appendTo( "#qunit-fixture" );
+               assert.equal( radio.val(), val + "attr", "Value starting with space character (" + key + ") returned (set via HTML)" );
+       } );
+} );
+
 var testAddClass = function( valueObj, assert ) {
        assert.expect( 9 );