]> source.dussan.org Git - jquery.git/commitdiff
Attributes: Drop the `toggleClass(boolean|undefined)` signature
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Tue, 1 Sep 2020 08:42:03 +0000 (10:42 +0200)
committerGitHub <noreply@github.com>
Tue, 1 Sep 2020 08:42:03 +0000 (10:42 +0200)
The behavior of this signature is not intuitive, especially if classes are
manipulated via other ways between `toggleClass` calls.

Fixes gh-3388
Closes gh-4766

src/attributes/classes.js
test/unit/attributes.js

index dcd8ad05974335754bea841ded58547e17f73c74..796fbcc808ca15bbe771f8c9c1a7bab3388f6128 100644 (file)
@@ -1,7 +1,6 @@
 import jQuery from "../core.js";
 import stripAndCollapse from "../core/stripAndCollapse.js";
 import rnothtmlwhite from "../var/rnothtmlwhite.js";
-import dataPriv from "../data/var/dataPriv.js";
 
 import "../core/init.js";
 
@@ -103,13 +102,6 @@ jQuery.fn.extend( {
        },
 
        toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       isValidValue = type === "string" || Array.isArray( value );
-
-               if ( typeof stateVal === "boolean" && isValidValue ) {
-                       return stateVal ? this.addClass( value ) : this.removeClass( value );
-               }
-
                if ( typeof value === "function" ) {
                        return this.each( function( i ) {
                                jQuery( this ).toggleClass(
@@ -119,45 +111,25 @@ jQuery.fn.extend( {
                        } );
                }
 
+               if ( typeof stateVal === "boolean" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
+
                return this.each( function() {
                        var className, i, self, classNames;
 
-                       if ( isValidValue ) {
-
-                               // Toggle individual class names
-                               i = 0;
-                               self = jQuery( this );
-                               classNames = classesToArray( value );
-
-                               while ( ( className = classNames[ i++ ] ) ) {
-
-                                       // Check each className given, space separated list
-                                       if ( self.hasClass( className ) ) {
-                                               self.removeClass( className );
-                                       } else {
-                                               self.addClass( className );
-                                       }
-                               }
-
-                       // Toggle whole class name
-                       } else if ( value === undefined || type === "boolean" ) {
-                               className = getClass( this );
-                               if ( className ) {
+                       // Toggle individual class names
+                       i = 0;
+                       self = jQuery( this );
+                       classNames = classesToArray( value );
 
-                                       // Store className if set
-                                       dataPriv.set( this, "__className__", className );
-                               }
+                       while ( ( className = classNames[ i++ ] ) ) {
 
-                               // If the element has a class name or if we're passed `false`,
-                               // then remove the whole classname (if there was one, the above saved it).
-                               // Otherwise bring back whatever was previously saved (if anything),
-                               // falling back to the empty string if nothing was stored.
-                               if ( this.setAttribute ) {
-                                       this.setAttribute( "class",
-                                               className || value === false ?
-                                                       "" :
-                                                       dataPriv.get( this, "__className__" ) || ""
-                                       );
+                               // Check each className given, space separated list
+                               if ( self.hasClass( className ) ) {
+                                       self.removeClass( className );
+                               } else {
+                                       self.addClass( className );
                                }
                        }
                } );
index 4b014bacc478327a54cddcc58a787733affc3eae..d83375172bd8e58adcbf8f424b6a34fa4bb50411 100644 (file)
@@ -1415,7 +1415,7 @@ QUnit.test( "removeClass(undefined) is a no-op", function( assert ) {
 } );
 
 var testToggleClass = function( valueObj, assert ) {
-       assert.expect( 19 );
+       assert.expect( 11 );
 
        var e = jQuery( "#firstp" );
        assert.ok( !e.is( ".test" ), "Assert class not present" );
@@ -1443,25 +1443,6 @@ var testToggleClass = function( valueObj, assert ) {
        assert.ok( ( e.is( ".testA.testC" ) && !e.is( ".testB" ) ), "Assert 1 class added, 1 class removed, and 1 class kept" );
        e.toggleClass( valueObj( "testA testC" ) );
        assert.ok( ( !e.is( ".testA" ) && !e.is( ".testB" ) && !e.is( ".testC" ) ), "Assert no class present" );
-
-       // toggleClass storage
-       e.toggleClass( true );
-       assert.ok( e[ 0 ].className === "", "Assert class is empty (data was empty)" );
-       e.addClass( "testD testE" );
-       assert.ok( e.is( ".testD.testE" ), "Assert class present" );
-       e.toggleClass();
-       assert.ok( !e.is( ".testD.testE" ), "Assert class not present" );
-       assert.ok( jQuery._data( e[ 0 ], "__className__" ) === "testD testE", "Assert data was stored" );
-       e.toggleClass();
-       assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" );
-       e.toggleClass( false );
-       assert.ok( !e.is( ".testD.testE" ), "Assert class not present" );
-       e.toggleClass( true );
-       assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" );
-       e.toggleClass();
-       e.toggleClass( false );
-       e.toggleClass();
-       assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" );
 };
 
 QUnit.test( "toggleClass(String|boolean|undefined[, boolean])", function( assert ) {