Skip to content

Commit db437be

Browse files
author
timmywil
committed
Check classes passed for duplicates. Fixes #9499.
1 parent 0a80be6 commit db437be

File tree

4 files changed

+39
-27
lines changed

4 files changed

+39
-27
lines changed

src/attributes.js

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,31 @@ jQuery.fn.extend({
3737
},
3838

3939
addClass: function( value ) {
40+
var classNames, i, l, elem, setClass, c, cl;
41+
4042
if ( jQuery.isFunction( value ) ) {
41-
return this.each(function(i) {
42-
var self = jQuery(this);
43-
self.addClass( value.call(this, i, self.attr("class") || "") );
43+
return this.each(function( j ) {
44+
var self = jQuery( this );
45+
self.addClass( value.call(this, j, self.attr("class") || "") );
4446
});
4547
}
4648

4749
if ( value && typeof value === "string" ) {
48-
var classNames = (value || "").split( rspace );
50+
classNames = value.split( rspace );
4951

50-
for ( var i = 0, l = this.length; i < l; i++ ) {
51-
var elem = this[i];
52+
for ( i = 0, l = this.length; i < l; i++ ) {
53+
elem = this[ i ];
5254

5355
if ( elem.nodeType === 1 ) {
54-
if ( !elem.className ) {
56+
if ( !elem.className && classNames.length === 1 ) {
5557
elem.className = value;
5658

5759
} else {
58-
var className = " " + elem.className + " ",
59-
setClass = elem.className;
60+
setClass = elem.className;
6061

61-
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
62-
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
63-
setClass += " " + classNames[c];
62+
for ( c = 0, cl = classNames.length; c < cl; c++ ) {
63+
if ( !~setClass.indexOf(classNames[ c ]) ) {
64+
setClass += " " + classNames[ c ];
6465
}
6566
}
6667
elem.className = jQuery.trim( setClass );
@@ -73,24 +74,26 @@ jQuery.fn.extend({
7374
},
7475

7576
removeClass: function( value ) {
76-
if ( jQuery.isFunction(value) ) {
77-
return this.each(function(i) {
78-
var self = jQuery(this);
79-
self.removeClass( value.call(this, i, self.attr("class")) );
77+
var classNames, i, l, elem, className, c, cl;
78+
79+
if ( jQuery.isFunction( value ) ) {
80+
return this.each(function( j ) {
81+
var self = jQuery( this );
82+
self.removeClass( value.call(this, j, self.attr("class")) );
8083
});
8184
}
8285

8386
if ( (value && typeof value === "string") || value === undefined ) {
84-
var classNames = (value || "").split( rspace );
87+
classNames = (value || "").split( rspace );
8588

86-
for ( var i = 0, l = this.length; i < l; i++ ) {
87-
var elem = this[i];
89+
for ( i = 0, l = this.length; i < l; i++ ) {
90+
elem = this[ i ];
8891

8992
if ( elem.nodeType === 1 && elem.className ) {
9093
if ( value ) {
91-
var className = (" " + elem.className + " ").replace(rclass, " ");
92-
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
93-
className = className.replace(" " + classNames[c] + " ", " ");
94+
className = (" " + elem.className + " ").replace( rclass, " " );
95+
for ( c = 0, cl = classNames.length; c < cl; c++ ) {
96+
className = className.replace(" " + classNames[ c ] + " ", " ");
9497
}
9598
elem.className = jQuery.trim( className );
9699

src/effects.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ var elemdisplay = {},
1515
],
1616
fxNow,
1717
requestAnimationFrame = window.webkitRequestAnimationFrame ||
18-
window.mozRequestAnimationFrame ||
19-
window.oRequestAnimationFrame;
18+
window.mozRequestAnimationFrame ||
19+
window.oRequestAnimationFrame;
2020

2121
jQuery.fn.extend({
2222
show: function( speed, easing, callback ) {

test/data/testsuite.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,5 @@ sup { display: none; }
119119
dfn { display: none; }
120120

121121
/* #9239 Attach a background to the body( avoid crashes in removing the test element in support ) */
122-
body, div { background: url(http://www.ctemploymentlawblog.com/test.jpg) no-repeat -1000px 0; }
122+
body, div { background: url(http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif) no-repeat -1000px 0; }
123123

test/unit/attributes.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -761,12 +761,14 @@ test("val(select) after form.reset() (Bug #2551)", function() {
761761
});
762762

763763
var testAddClass = function(valueObj) {
764-
expect(5);
764+
expect(7);
765765
var div = jQuery("div");
766766
div.addClass( valueObj("test") );
767767
var pass = true;
768768
for ( var i = 0; i < div.size(); i++ ) {
769-
if ( div.get(i).className.indexOf("test") == -1 ) pass = false;
769+
if ( !~div.get(i).className.indexOf("test") ) {
770+
pass = false;
771+
}
770772
}
771773
ok( pass, "Add Class" );
772774

@@ -787,6 +789,13 @@ var testAddClass = function(valueObj) {
787789
div.attr("class", "foo");
788790
div.addClass( valueObj("bar baz") );
789791
equals( div.attr("class"), "foo bar baz", "Make sure there isn't too much trimming." );
792+
793+
div.removeAttr("class");
794+
div.addClass( valueObj("foo") ).addClass( valueObj("foo") )
795+
equal( div.attr("class"), "foo", "Do not add the same class twice in separate calls." );
796+
div.removeAttr("class");
797+
div.addClass( valueObj("bar bar") );
798+
equal( div.attr("class"), "bar", "Do not add the same class twice in the same call." );
790799
};
791800

792801
test("addClass(String)", function() {

0 commit comments

Comments
 (0)