From db437be6e31c924aade13bb719f9facc122b3d9c Mon Sep 17 00:00:00 2001 From: timmywil Date: Tue, 7 Jun 2011 20:54:11 -0400 Subject: [PATCH] Check classes passed for duplicates. Fixes #9499. --- src/attributes.js | 47 ++++++++++++++++++++++------------------- src/effects.js | 4 ++-- test/data/testsuite.css | 2 +- test/unit/attributes.js | 13 ++++++++++-- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index abe52b89..5b68773c 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -37,30 +37,31 @@ jQuery.fn.extend({ }, addClass: function( value ) { + var classNames, i, l, elem, setClass, c, cl; + if ( jQuery.isFunction( value ) ) { - return this.each(function(i) { - var self = jQuery(this); - self.addClass( value.call(this, i, self.attr("class") || "") ); + return this.each(function( j ) { + var self = jQuery( this ); + self.addClass( value.call(this, j, self.attr("class") || "") ); }); } if ( value && typeof value === "string" ) { - var classNames = (value || "").split( rspace ); + classNames = value.split( rspace ); - for ( var i = 0, l = this.length; i < l; i++ ) { - var elem = this[i]; + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; if ( elem.nodeType === 1 ) { - if ( !elem.className ) { + if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { - var className = " " + elem.className + " ", - setClass = elem.className; + setClass = elem.className; - for ( var c = 0, cl = classNames.length; c < cl; c++ ) { - if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { - setClass += " " + classNames[c]; + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf(classNames[ c ]) ) { + setClass += " " + classNames[ c ]; } } elem.className = jQuery.trim( setClass ); @@ -73,24 +74,26 @@ jQuery.fn.extend({ }, removeClass: function( value ) { - if ( jQuery.isFunction(value) ) { - return this.each(function(i) { - var self = jQuery(this); - self.removeClass( value.call(this, i, self.attr("class")) ); + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + var self = jQuery( this ); + self.removeClass( value.call(this, j, self.attr("class")) ); }); } if ( (value && typeof value === "string") || value === undefined ) { - var classNames = (value || "").split( rspace ); + classNames = (value || "").split( rspace ); - for ( var i = 0, l = this.length; i < l; i++ ) { - var elem = this[i]; + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { - var className = (" " + elem.className + " ").replace(rclass, " "); - for ( var c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[c] + " ", " "); + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); diff --git a/src/effects.js b/src/effects.js index 22496277..3a4e2663 100644 --- a/src/effects.js +++ b/src/effects.js @@ -15,8 +15,8 @@ var elemdisplay = {}, ], fxNow, requestAnimationFrame = window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame; + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame; jQuery.fn.extend({ show: function( speed, easing, callback ) { diff --git a/test/data/testsuite.css b/test/data/testsuite.css index 47caf34a..295740f5 100644 --- a/test/data/testsuite.css +++ b/test/data/testsuite.css @@ -119,5 +119,5 @@ sup { display: none; } dfn { display: none; } /* #9239 Attach a background to the body( avoid crashes in removing the test element in support ) */ -body, div { background: url(http://www.ctemploymentlawblog.com/test.jpg) no-repeat -1000px 0; } +body, div { background: url(http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif) no-repeat -1000px 0; } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 56c398e5..37260f2f 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -761,12 +761,14 @@ test("val(select) after form.reset() (Bug #2551)", function() { }); var testAddClass = function(valueObj) { - expect(5); + expect(7); var div = jQuery("div"); div.addClass( valueObj("test") ); var pass = true; for ( var i = 0; i < div.size(); i++ ) { - if ( div.get(i).className.indexOf("test") == -1 ) pass = false; + if ( !~div.get(i).className.indexOf("test") ) { + pass = false; + } } ok( pass, "Add Class" ); @@ -787,6 +789,13 @@ var testAddClass = function(valueObj) { div.attr("class", "foo"); div.addClass( valueObj("bar baz") ); equals( div.attr("class"), "foo bar baz", "Make sure there isn't too much trimming." ); + + div.removeAttr("class"); + div.addClass( valueObj("foo") ).addClass( valueObj("foo") ) + equal( div.attr("class"), "foo", "Do not add the same class twice in separate calls." ); + div.removeAttr("class"); + div.addClass( valueObj("bar bar") ); + equal( div.attr("class"), "bar", "Do not add the same class twice in the same call." ); }; test("addClass(String)", function() {