From 3206be877250f5fe958a0519ef19d52e277687ca Mon Sep 17 00:00:00 2001 From: Rick Waldron Date: Sat, 23 Jun 2012 19:38:27 -0400 Subject: [PATCH] Make removeClass smart enough to remove duplicates. Fixes #11923 --- src/attributes.js | 23 +++++++++++------------ test/unit/attributes.js | 10 ++++++++++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index 23a4fddd0..6ec1c7154 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -71,31 +71,30 @@ jQuery.fn.extend({ }, removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; + var removes, className, elem, c, cl, i, l; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( core_rspace ); + removes = ( value || "" ).split( core_rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - } else { - elem.className = ""; + className = (" " + elem.className + " ").replace( rclass, " " ); + + // loop over each item in the removal list + for ( c = 0, cl = removes.length; c < cl; c++ ) { + // Remove until there is nothing to remove, + while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) { + className = className.replace( " " + removes[ c ] + " " , " " ); + } } + elem.className = value ? jQuery.trim( className ) : ""; } } } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index ad7f79d1e..b6a1b5d0e 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -1055,6 +1055,16 @@ test("removeClass(Function) with incoming value", function() { QUnit.reset(); }); +test("removeClass() removes duplicates", function() { + expect(1); + + var $div = jQuery( jQuery.parseHTML("
") ); + + $div.removeClass("x"); + + ok( !$div.hasClass("x"), "Element with multiple same classes does not escape the wrath of removeClass()" ); +}); + var testToggleClass = function(valueObj) { expect(17); -- 2.39.5