Make removeClass smart enough to remove duplicates. Fixes #11923

This commit is contained in:
Rick Waldron 2012-06-23 19:38:27 -04:00
parent 4df3aaeab3
commit 3206be8772
2 changed files with 21 additions and 12 deletions

View File

@ -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 ) : "";
}
}
}

View File

@ -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 class='x x x'></div>") );
$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);