Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 9db0cdf

Browse files
committed
perf(jqLite): use classList for class manipulation if available
All elements/browsers that don't have classList will still use the old setTimeout method.
1 parent 6c2cb15 commit 9db0cdf

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

Diff for: src/jqLite.js

+24-10
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,32 @@ function jqLiteRemoveClass(element, cssClasses) {
354354
}
355355

356356
function jqLiteAddClass(element, cssClasses) {
357-
if (cssClasses && element.setAttribute) {
358-
var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
359-
.replace(/[\n\t]/g, " ");
360-
361-
forEach(cssClasses.split(' '), function(cssClass) {
362-
cssClass = trim(cssClass);
363-
if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
364-
existingClasses += cssClass + ' ';
357+
if (cssClasses) {
358+
359+
// if browser and element support classList api use it
360+
if (element.classList) {
361+
cssClasses = trim(cssClasses);
362+
if (cssClasses) {
363+
cssClasses = cssClasses.split(/\s+/);
364+
if (cssClasses.length === 1) {
365+
element.classList.add(cssClasses[0])
366+
} else {
367+
element.classList.add.apply(element.classList, cssClasses);
368+
}
365369
}
366-
});
370+
} else if (element.setAttribute) {
371+
var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
372+
.replace(/[\n\t]/g, " ");
373+
374+
forEach(cssClasses.split(' '), function (cssClass) {
375+
cssClass = trim(cssClass);
376+
if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
377+
existingClasses += cssClass + ' ';
378+
}
379+
});
367380

368-
element.setAttribute('class', trim(existingClasses));
381+
element.setAttribute('class', trim(existingClasses));
382+
}
369383
}
370384
}
371385

Diff for: test/ngAnimate/animateSpec.js

+9
Original file line numberDiff line numberDiff line change
@@ -3344,6 +3344,15 @@ describe("ngAnimate", function() {
33443344
}
33453345
node._setAttribute(prop, val);
33463346
};
3347+
node._classListAdd = node.classList.add;
3348+
node.classList.add = function(cssClass) {
3349+
if (cssClass === 'trigger-class') {
3350+
var propertyKey = ($sniffer.vendorPrefix == 'Webkit' ? '-webkit-' : '') + 'transition-property';
3351+
capturedProperty = element.css(propertyKey);
3352+
}
3353+
3354+
return node._classListAdd.apply(node.classList, arguments);
3355+
};
33473356

33483357
expect(capturedProperty).toBe('none');
33493358
$animate.addClass(element, 'trigger-class');

0 commit comments

Comments
 (0)