diff --git a/src/jqLite.js b/src/jqLite.js index b199f390e329..93b863bb42df 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -358,20 +358,24 @@ function jqLiteHasClass(element, selector) { } function jqLiteRemoveClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { + if (cssClasses && (element.setAttribute || msie === 9)) { + var existingClasses = (" " + + ((element.getAttribute && element.getAttribute('class')) || + element.className || '') + + " ").replace(/[\n\t]/g, " "); + forEach(cssClasses.split(' '), function(cssClass) { - element.setAttribute('class', trim( - (" " + (element.getAttribute('class') || '') + " ") - .replace(/[\n\t]/g, " ") - .replace(" " + trim(cssClass) + " ", " ")) - ); + existingClasses = existingClasses.replace(" " + trim(cssClass) + " ", " "); }); + + (msie === 9 && !(element instanceof SVGElement)) ? element.className = trim(existingClasses) : + element.setAttribute('class', trim(existingClasses)); } } function jqLiteAddClass(element, cssClasses) { if (cssClasses && element.setAttribute) { - var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + var existingClasses = (' ' + (element.getAttribute('class') || element.className || '') + ' ') .replace(/[\n\t]/g, " "); forEach(cssClasses.split(' '), function(cssClass) { @@ -381,7 +385,8 @@ function jqLiteAddClass(element, cssClasses) { } }); - element.setAttribute('class', trim(existingClasses)); + (msie === 9 && !(element instanceof SVGElement)) ? element.className = trim(existingClasses) : + element.setAttribute('class', trim(existingClasses)); } } diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 356d2a36167f..1d236a84b41b 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -714,6 +714,15 @@ describe('jqLite', function() { }); + it('should allow adding of class in IE9', function() { + if (!(jqLite(a).setAttribute && jqLite(a).getAttribute)) return; // IE9 doesn't support node.setAttribute + var selector = jqLite([a, b]); + expect(selector.addClass('abc')).toBe(selector); + expect(jqLite(a).hasClass('abc')).toBe(true); + expect(jqLite(b).hasClass('abc')).toBe(true); + }); + + it('should ignore falsy values', function() { var jqA = jqLite(a); expect(jqA[0].className).toBe(''); @@ -836,6 +845,17 @@ describe('jqLite', function() { }); + it('should allow removal of class in IE9', function() { + if (!(jqLite(a).setAttribute && jqLite(a).getAttribute)) return; // IE9 doesn't support node.setAttribute + var selector = jqLite([a, b]); + a.className = 'abc'; + b.className = 'abc'; + expect(selector.removeClass('abc')).toBe(selector); + expect(jqLite(a).hasClass('abc')).toBe(false); + expect(jqLite(b).hasClass('abc')).toBe(false); + }); + + it('should correctly remove middle class', function() { var element = jqLite('
'); expect(element.hasClass('bar')).toBe(true);