From 649024909d376032e6e9c41f209182d584e51043 Mon Sep 17 00:00:00 2001 From: Batiste Bieler Date: Mon, 14 Dec 2009 16:24:28 -0500 Subject: [PATCH] Enforce that hasClass and removeClass work even with tabs and endlines in class attributes. Fixes #5505. --- src/attributes.js | 6 ++++-- test/unit/attributes.js | 28 +++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index 0b6d21ec..17c18c9b 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -1,3 +1,5 @@ +var rclass = /[\n\t]/g; + jQuery.fn.extend({ attr: function( name, value ) { return access(this, name, value, true, jQuery.attr); @@ -49,7 +51,7 @@ jQuery.fn.extend({ if ( elem.nodeType === 1 && elem.className ) { if ( value ) { - var className = " " + elem.className + " "; + var className = (" " + elem.className + " ").replace(rclass, " "); for ( var c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[c] + " ", " "); } @@ -67,7 +69,7 @@ jQuery.fn.extend({ hasClass: function( selector ) { var className = " " + selector + " "; for ( var i = 0, l = this.length; i < l; i++ ) { - if ( (" " + this[i].className + " ").indexOf( className ) > -1 ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 67077b9b..9f0da1fd 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -427,23 +427,37 @@ test("removeAttr(Function)", function() { }); test("addClass, removeClass, hasClass", function() { - expect(6); - + expect(14); + var jq = jQuery("

Hi

"), x = jq[0]; - + jq.addClass("hi"); equals( x.className, "hi", "Check single added class" ); - + jq.addClass("foo bar"); equals( x.className, "hi foo bar", "Check more added classes" ); - + jq.removeClass(); equals( x.className, "", "Remove all classes" ); - + jq.addClass("hi foo bar"); jq.removeClass("foo"); equals( x.className, "hi bar", "Check removal of one class" ); - + ok( jq.hasClass("hi"), "Check has1" ); ok( jq.hasClass("bar"), "Check has2" ); + + var jq = jQuery("

"); + ok( jq.hasClass("class1"), "Check hasClass with carriage return" ); + ok( jq.is(".class1"), "Check is with carriage return" ); + ok( jq.hasClass("class2"), "Check hasClass with tab" ); + ok( jq.is(".class2"), "Check is with tab" ); + ok( jq.hasClass("cla.ss3"), "Check hasClass with dot" ); + + jq.removeClass("class2"); + ok( jq.hasClass("class2")==false, "Check the class has been properly removed" ); + jq.removeClass("cla"); + ok( jq.hasClass("cla.ss3"), "Check the dotted class has not been removed" ); + jq.removeClass("cla.ss3"); + ok( jq.hasClass("cla.ss3")==false, "Check the dotted class has been removed" ); });