Permalink
Browse files

Allow similarly named classes (regression from 9499) and switch class…

… retrieval to property when passing class to value functions. Fixes #9617.
  • Loading branch information...
1 parent 124817e commit 96501d38a935187461d45c40f17f8327b2e7cd91 timmywil committed Jun 19, 2011
Showing with 20 additions and 15 deletions.
  1. +9 −11 src/attributes.js
  2. +11 −4 test/unit/attributes.js
View
@@ -37,12 +37,12 @@ jQuery.fn.extend({
},
addClass: function( value ) {
- var classNames, i, l, elem, setClass, c, cl;
+ var classNames, i, l, elem,
+ setClass, c, cl;
if ( jQuery.isFunction( value ) ) {
return this.each(function( j ) {
- var self = jQuery( this );
- self.addClass( value.call(this, j, self.attr("class") || "") );
+ jQuery( this ).addClass( value.call(this, j, this.className) );
});
}
@@ -57,11 +57,11 @@ jQuery.fn.extend({
elem.className = value;
} else {
- setClass = elem.className;
+ setClass = " " + elem.className + " ";
for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf(classNames[ c ]) ) {
- setClass += " " + classNames[ c ];
+ if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+ setClass += classNames[ c ] + " ";
}
}
elem.className = jQuery.trim( setClass );
@@ -78,8 +78,7 @@ jQuery.fn.extend({
if ( jQuery.isFunction( value ) ) {
return this.each(function( j ) {
- var self = jQuery( this );
- self.removeClass( value.call(this, j, self.attr("class")) );
+ jQuery( this ).removeClass( value.call(this, j, this.className) );
});
}
@@ -112,9 +111,8 @@ jQuery.fn.extend({
isBool = typeof stateVal === "boolean";
if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
});
}
@@ -762,7 +762,8 @@ test("val(select) after form.reset() (Bug #2551)", function() {
});
var testAddClass = function(valueObj) {
- expect(7);
+ expect(9);
+
var div = jQuery("div");
div.addClass( valueObj("test") );
var pass = true;
@@ -791,10 +792,16 @@ var testAddClass = function(valueObj) {
div.addClass( valueObj("bar baz") );
equals( div.attr("class"), "foo bar baz", "Make sure there isn't too much trimming." );
- div.removeAttr("class");
+ div.removeClass();
@Krinkle
Krinkle Mar 19, 2012 jQuery member

What is .removeClass() supposed to do here?

edit: Ah, value === undefined -> className = "", I didn't know that. has been supported ever since 96dd06e. Nice :)

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("fo") );
+ equal( div.attr("class"), "foo fo", "Adding a similar class does not get interrupted." );
+ div.removeClass().addClass("wrap2");
+ ok( div.addClass("wrap").hasClass("wrap"), "Can add similarly named classes");
+
+ div.removeClass();
div.addClass( valueObj("bar bar") );
equal( div.attr("class"), "bar", "Do not add the same class twice in the same call." );
};
@@ -959,7 +966,7 @@ test("toggleClass(Function[, boolean])", function() {
test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
expect(14);
- var e = jQuery("#firstp"), old = e.attr("class");
+ var e = jQuery("#firstp"), old = e.attr("class") || "";
ok( !e.is(".test"), "Assert class not present" );
e.toggleClass(function(i, val) {

2 comments on commit 96501d3

@timmywil
Member

As the bugs site is currently down, I'm grouping the latter part with the first bug. For more information on what I'm fixing there, here's a test case:

Compare jQuery version 1.5.2 and 1.6. - http://jsfiddle.net/timmywil/HqCLn/2/
You'll see "" and "", then undefined and "".

When no class is present, empty string should be passed to value functions. This wasn't caught in the tests in 1.6 because it was just comparing what was returning by attr with what was returned by attr. Not a big one, but will now be consistent and slightly faster as there is no longer a call to attr.

I'll add this info to the bug ticket when the site is back.

@timmywil
Member

Here's the second issue that was fixed in this commit: #9624

Please sign in to comment.