🌐 AI搜索 & 代理 主页
Skip to content

Commit 96dd06e

Browse files
committed
Removed jQuery.className.(has|remove|add) in favor of .addClass/removeClass/hasClass. Also rewrote the functions for additional performance.
1 parent 520f1a2 commit 96dd06e

File tree

2 files changed

+76
-46
lines changed

2 files changed

+76
-46
lines changed

src/attributes.js

Lines changed: 59 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,64 @@ jQuery.fn.extend({
3131
return this;
3232
},
3333

34+
addClass: function( value ) {
35+
if ( value && typeof value === "string" ) {
36+
var classNames = (value || "").split(/\s+/);
37+
38+
for ( var i = 0, l = this.length; i < l; i++ ) {
39+
var elem = this[i];
40+
41+
if ( elem.nodeType === 1 ) {
42+
if ( !elem.className ) {
43+
elem.className = value;
44+
} else {
45+
var className = " " + elem.className + " ";
46+
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
47+
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
48+
elem.className += " " + classNames[c];
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
56+
return this;
57+
},
58+
59+
removeClass: function( value ) {
60+
if ( (value && typeof value === "string") || value === undefined ) {
61+
var classNames = (value || "").split(/\s+/);
62+
63+
for ( var i = 0, l = this.length; i < l; i++ ) {
64+
var elem = this[i];
65+
66+
if ( elem.nodeType === 1 && elem.className ) {
67+
if ( value ) {
68+
var className = " " + elem.className + " ";
69+
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
70+
className = className.replace(" " + classNames[c] + " ", " ");
71+
}
72+
elem.className = className.substring(1, className.length - 1);
73+
} else {
74+
elem.className = "";
75+
}
76+
}
77+
}
78+
}
79+
80+
return this;
81+
},
82+
3483
hasClass: function( selector ) {
35-
return !!selector && this.is( "." + selector );
84+
var className = " " + selector + " ";
85+
for ( var i = 0, l = this.length; i < l; i++ ) {
86+
if ( (" " + this[i].className + " ").indexOf( className ) > -1 ) {
87+
return true;
88+
}
89+
}
90+
91+
return false;
3692
},
3793

3894
val: function( value ) {
@@ -125,14 +181,6 @@ jQuery.each({
125181
this.removeAttribute( name );
126182
},
127183

128-
addClass: function( classNames ) {
129-
jQuery.className.add( this, classNames );
130-
},
131-
132-
removeClass: function( classNames ) {
133-
jQuery.className.remove( this, classNames );
134-
},
135-
136184
toggleClass: function( classNames, state ) {
137185
var type = typeof classNames;
138186
if ( type === "string" ) {
@@ -141,8 +189,8 @@ jQuery.each({
141189
classNames = classNames.split( /\s+/ );
142190
while ( (className = classNames[ i++ ]) ) {
143191
// check each className given, space seperated list
144-
state = isBool ? state : !jQuery.className.has( this, className );
145-
jQuery.className[ state ? "add" : "remove" ]( this, className );
192+
state = isBool ? state : !jQuery(this).hasClass( className );
193+
jQuery(this)[ state ? "addClass" : "removeClass" ]( className );
146194
}
147195
} else if ( type === "undefined" || type === "boolean" ) {
148196
if ( this.className ) {
@@ -160,31 +208,6 @@ jQuery.each({
160208
});
161209

162210
jQuery.extend({
163-
className: {
164-
// internal only, use addClass("class")
165-
add: function( elem, classNames ) {
166-
jQuery.each((classNames || "").split(/\s+/), function(i, className){
167-
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
168-
elem.className += (elem.className ? " " : "") + className;
169-
});
170-
},
171-
172-
// internal only, use removeClass("class")
173-
remove: function( elem, classNames ) {
174-
if (elem.nodeType == 1)
175-
elem.className = classNames !== undefined ?
176-
jQuery.grep(elem.className.split(/\s+/), function(className){
177-
return !jQuery.className.has( classNames, className );
178-
}).join(" ") :
179-
"";
180-
},
181-
182-
// internal only, use hasClass("class")
183-
has: function( elem, className ) {
184-
return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
185-
}
186-
},
187-
188211
attr: function( elem, name, value ) {
189212
// don't set attributes on text and comment nodes
190213
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)

test/unit/attributes.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,15 @@ test("removeClass(String) - simple", function() {
272272
ok( !$divs.is('.test'), "Remove Class" );
273273

274274
reset();
275+
$divs = jQuery('div');
275276

276277
$divs.addClass("test").addClass("foo").addClass("bar");
277278
$divs.removeClass("test").removeClass("bar").removeClass("foo");
278279

279280
ok( !$divs.is('.test,.bar,.foo'), "Remove multiple classes" );
280281

281282
reset();
283+
$divs = jQuery('div');
282284

283285
// Make sure that a null value doesn't cause problems
284286
$divs.eq(0).addClass("test").removeClass(null);
@@ -350,19 +352,24 @@ test("removeAttr(String", function() {
350352
equals( jQuery('#mark').removeAttr("class")[0].className, "", "remove class" );
351353
});
352354

353-
test("jQuery.className", function() {
355+
test("addClass, removeClass, hasClass", function() {
354356
expect(6);
355-
var x = jQuery("<p>Hi</p>")[0];
356-
var c = jQuery.className;
357-
c.add(x, "hi");
357+
358+
var jq = jQuery("<p>Hi</p>"), x = jq[0];
359+
360+
jq.addClass("hi");
358361
equals( x.className, "hi", "Check single added class" );
359-
c.add(x, "foo bar");
362+
363+
jq.addClass("foo bar");
360364
equals( x.className, "hi foo bar", "Check more added classes" );
361-
c.remove(x);
365+
366+
jq.removeClass();
362367
equals( x.className, "", "Remove all classes" );
363-
c.add(x, "hi foo bar");
364-
c.remove(x, "foo");
368+
369+
jq.addClass("hi foo bar");
370+
jq.removeClass("foo");
365371
equals( x.className, "hi bar", "Check removal of one class" );
366-
ok( c.has(x, "hi"), "Check has1" );
367-
ok( c.has(x, "bar"), "Check has2" );
372+
373+
ok( jq.hasClass("hi"), "Check has1" );
374+
ok( jq.hasClass("bar"), "Check has2" );
368375
});

0 commit comments

Comments
 (0)