]> source.dussan.org Git - jquery.git/commitdiff
Check classes passed for duplicates. Fixes #9499.
authortimmywil <tim.willison@thisismedium.com>
Wed, 8 Jun 2011 00:54:11 +0000 (20:54 -0400)
committertimmywil <tim.willison@thisismedium.com>
Wed, 8 Jun 2011 01:00:44 +0000 (21:00 -0400)
src/attributes.js
src/effects.js
test/data/testsuite.css
test/unit/attributes.js

index abe52b896bc52a00f456f43934c6da7a801f795b..5b68773c90238764ec1550c111f41df58ed151e9 100644 (file)
@@ -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 );
 
index 2249627738b96240a07842aa5ee023829cb5b21a..3a4e2663d5d3c5a7c5d7e97c93b74dbc0b8b46d1 100644 (file)
@@ -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 ) {
index 47caf34a32f851c71394b0200d3c9c6fdef75674..295740f5c343781cad8396b0a07eee1e9e632cf5 100644 (file)
@@ -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; }
 
index 56c398e5cd48afb9b623fcf64da4e4ea4a26eec9..37260f2faa48e7f0b6fd2319b363b7cb4a64c20c 100644 (file)
@@ -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() {