aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Waldron <waldron.rick@gmail.com>2012-06-23 19:38:27 -0400
committerRick Waldron <waldron.rick@gmail.com>2012-06-23 19:38:27 -0400
commit3206be877250f5fe958a0519ef19d52e277687ca (patch)
tree901fb55ca20104137e90413bcbe376905388dd92
parent4df3aaeab3f5c1f54d7564fe9973f6bf35664265 (diff)
downloadjquery-3206be877250f5fe958a0519ef19d52e277687ca.tar.gz
jquery-3206be877250f5fe958a0519ef19d52e277687ca.zip
Make removeClass smart enough to remove duplicates. Fixes #11923
-rw-r--r--src/attributes.js23
-rw-r--r--test/unit/attributes.js10
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 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);