]> source.dussan.org Git - jquery.git/commitdiff
Revert "Attributes: Remove undocumented .toggleClass( boolean ) signature"
authorTimmy Willison <timmywillisn@gmail.com>
Thu, 7 Jan 2016 18:09:30 +0000 (13:09 -0500)
committerTimmy Willison <timmywillisn@gmail.com>
Thu, 7 Jan 2016 18:09:30 +0000 (13:09 -0500)
This reverts commit f24726daa3760014b7283ad14a13117c72dd9474.

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

index 7ce91520236f8066b40b19edbfd802bd45dc9629..b1539193c467074e82d075c3fc03597760ebb066 100644 (file)
@@ -96,26 +96,60 @@ jQuery.fn.extend( {
        },
 
        toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       classNames = type === "string" ? value.match( rnotwhite ) : [];
+               var type = typeof value;
 
-               return this.each( function( i ) {
-                       var className,
-                               self = jQuery( this ),
-                               c = 0;
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
 
-                       if ( type === "function" ) {
-                               classNames = value.call( this, i, getClass( this ), stateVal )
-                                       .match( rnotwhite ) || [];
-                       }
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each( function( i ) {
+                               jQuery( this ).toggleClass(
+                                       value.call( this, i, getClass( this ), stateVal ),
+                                       stateVal
+                               );
+                       } );
+               }
+
+               return this.each( function() {
+                       var className, i, self, classNames;
+
+                       if ( type === "string" ) {
 
-                       // Toggle individual class names based on presence or stateVal
-                       while ( ( className = classNames[ c++ ] ) ) {
+                               // Toggle individual class names
+                               i = 0;
+                               self = jQuery( this );
+                               classNames = value.match( rnotwhite ) || [];
+
+                               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 ) {
+
+                                       // store className if set
+                                       jQuery._data( this, "__className__", className );
+                               }
 
-                               if ( stateVal === false || stateVal !== true && self.hasClass( className ) ) {
-                                       self.removeClass( className );
-                               } else {
-                                       self.addClass( className );
+                               // 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 ?
+                                               "" :
+                                               jQuery._data( this, "__className__" ) || ""
+                                       );
                                }
                        }
                } );
index be905cfd6b5f9ded14aeab075a95a92d03b5207b..b7470b0eb8037b032dc69b6a81f395946964e055 100644 (file)
@@ -1232,7 +1232,7 @@ QUnit.test( "removeClass(undefined) is a no-op", function( assert ) {
 } );
 
 var testToggleClass = function( valueObj, assert ) {
-       assert.expect( 11 );
+       assert.expect( 19 );
 
        var e = jQuery( "#firstp" );
        assert.ok( !e.is( ".test" ), "Assert class not present" );
@@ -1260,6 +1260,29 @@ 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)" );
+
+       // Cleanup
+       e.removeClass( "testD" );
+       assert.expectJqData( this, e[ 0 ], "__className__" );
 };
 
 QUnit.test( "toggleClass(String|boolean|undefined[, boolean])", function( assert ) {