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

Commit 4e73c80

Browse files
fix(jqLite): properly toggle multiple classes
Fixes #4467 Closes #6448
1 parent 27873ac commit 4e73c80

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

src/jqLite.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -840,10 +840,15 @@ forEach({
840840
removeClass: jqLiteRemoveClass,
841841

842842
toggleClass: function(element, selector, condition) {
843-
if (isUndefined(condition)) {
844-
condition = !jqLiteHasClass(element, selector);
843+
if (selector) {
844+
forEach(selector.split(' '), function(className){
845+
var classCondition = condition;
846+
if (isUndefined(classCondition)) {
847+
classCondition = !jqLiteHasClass(element, className);
848+
}
849+
(classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);
850+
});
845851
}
846-
(condition ? jqLiteAddClass : jqLiteRemoveClass)(element, selector);
847852
},
848853

849854
parent: function(element) {

test/jqLiteSpec.js

+51
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,57 @@ describe('jqLite', function() {
666666
expect(jqLite(b).hasClass('abc')).toEqual(false);
667667

668668
});
669+
670+
it('should allow toggling multiple classes without a condition', function () {
671+
var selector = jqLite([a, b]);
672+
expect(selector.toggleClass('abc cde')).toBe(selector);
673+
expect(jqLite(a).hasClass('abc')).toBe(true);
674+
expect(jqLite(a).hasClass('cde')).toBe(true);
675+
expect(jqLite(b).hasClass('abc')).toBe(true);
676+
expect(jqLite(b).hasClass('cde')).toBe(true);
677+
678+
expect(selector.toggleClass('abc cde')).toBe(selector);
679+
expect(jqLite(a).hasClass('abc')).toBe(false);
680+
expect(jqLite(a).hasClass('cde')).toBe(false);
681+
expect(jqLite(b).hasClass('abc')).toBe(false);
682+
expect(jqLite(b).hasClass('cde')).toBe(false);
683+
684+
expect(selector.toggleClass('abc')).toBe(selector);
685+
expect(selector.toggleClass('abc cde')).toBe(selector);
686+
expect(jqLite(a).hasClass('abc')).toBe(false);
687+
expect(jqLite(a).hasClass('cde')).toBe(true);
688+
expect(jqLite(b).hasClass('abc')).toBe(false);
689+
expect(jqLite(b).hasClass('cde')).toBe(true);
690+
691+
expect(selector.toggleClass('abc cde')).toBe(selector);
692+
expect(jqLite(a).hasClass('abc')).toBe(true);
693+
expect(jqLite(a).hasClass('cde')).toBe(false);
694+
expect(jqLite(b).hasClass('abc')).toBe(true);
695+
expect(jqLite(b).hasClass('cde')).toBe(false);
696+
});
697+
698+
it('should allow toggling multiple classes with a condition', function () {
699+
var selector = jqLite([a, b]);
700+
selector.addClass('abc');
701+
expect(selector.toggleClass('abc cde', true)).toBe(selector);
702+
expect(jqLite(a).hasClass('abc')).toBe(true);
703+
expect(jqLite(a).hasClass('cde')).toBe(true);
704+
expect(jqLite(b).hasClass('abc')).toBe(true);
705+
expect(jqLite(b).hasClass('cde')).toBe(true);
706+
707+
selector.removeClass('abc');
708+
expect(selector.toggleClass('abc cde', false)).toBe(selector);
709+
expect(jqLite(a).hasClass('abc')).toBe(false);
710+
expect(jqLite(a).hasClass('cde')).toBe(false);
711+
expect(jqLite(b).hasClass('abc')).toBe(false);
712+
expect(jqLite(b).hasClass('cde')).toBe(false);
713+
});
714+
715+
it('should not break for null / undefined selectors', function () {
716+
var selector = jqLite([a, b]);
717+
expect(selector.toggleClass(null)).toBe(selector);
718+
expect(selector.toggleClass(undefined)).toBe(selector);
719+
});
669720
});
670721

671722

0 commit comments

Comments
 (0)