Skip to content

Commit 3206be8

Browse files
committed
Make removeClass smart enough to remove duplicates. Fixes #11923
1 parent 4df3aae commit 3206be8

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

src/attributes.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,31 +71,30 @@ jQuery.fn.extend({
7171
},
7272

7373
removeClass: function( value ) {
74-
var classNames, i, l, elem, className, c, cl;
74+
var removes, className, elem, c, cl, i, l;
7575

7676
if ( jQuery.isFunction( value ) ) {
7777
return this.each(function( j ) {
7878
jQuery( this ).removeClass( value.call(this, j, this.className) );
7979
});
8080
}
81-
8281
if ( (value && typeof value === "string") || value === undefined ) {
83-
classNames = ( value || "" ).split( core_rspace );
82+
removes = ( value || "" ).split( core_rspace );
8483

8584
for ( i = 0, l = this.length; i < l; i++ ) {
8685
elem = this[ i ];
87-
8886
if ( elem.nodeType === 1 && elem.className ) {
89-
if ( value ) {
90-
className = (" " + elem.className + " ").replace( rclass, " " );
91-
for ( c = 0, cl = classNames.length; c < cl; c++ ) {
92-
className = className.replace(" " + classNames[ c ] + " ", " ");
93-
}
94-
elem.className = jQuery.trim( className );
9587

96-
} else {
97-
elem.className = "";
88+
className = (" " + elem.className + " ").replace( rclass, " " );
89+
90+
// loop over each item in the removal list
91+
for ( c = 0, cl = removes.length; c < cl; c++ ) {
92+
// Remove until there is nothing to remove,
93+
while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
94+
className = className.replace( " " + removes[ c ] + " " , " " );
95+
}
9896
}
97+
elem.className = value ? jQuery.trim( className ) : "";
9998
}
10099
}
101100
}

test/unit/attributes.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,6 +1055,16 @@ test("removeClass(Function) with incoming value", function() {
10551055
QUnit.reset();
10561056
});
10571057

1058+
test("removeClass() removes duplicates", function() {
1059+
expect(1);
1060+
1061+
var $div = jQuery( jQuery.parseHTML("<div class='x x x'></div>") );
1062+
1063+
$div.removeClass("x");
1064+
1065+
ok( !$div.hasClass("x"), "Element with multiple same classes does not escape the wrath of removeClass()" );
1066+
});
1067+
10581068
var testToggleClass = function(valueObj) {
10591069
expect(17);
10601070

0 commit comments

Comments
 (0)