fix(jqLite): ignore class methods on comment elements

Since c785267e jqLite uses setAttribute (rather than className property) in order to change classes. Some elements (eg. Comment) do not have this method which blows up.

jQuery silently ignores these method calls (because it uses className), so to get the same behavior as jQuery, we check for setAttribute method first.
This commit is contained in:
Vojta Jina 2013-10-09 13:51:59 -07:00
parent b6a37d112b
commit 64fd2c421e
2 changed files with 13 additions and 2 deletions

View file

@ -279,12 +279,13 @@ function JQLiteData(element, key, value) {
}
function JQLiteHasClass(element, selector) {
if (!element.getAttribute) return false;
return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").
indexOf( " " + selector + " " ) > -1);
}
function JQLiteRemoveClass(element, cssClasses) {
if (cssClasses) {
if (cssClasses && element.setAttribute) {
forEach(cssClasses.split(' '), function(cssClass) {
element.setAttribute('class', trim(
(" " + (element.getAttribute('class') || '') + " ")
@ -296,7 +297,7 @@ function JQLiteRemoveClass(element, cssClasses) {
}
function JQLiteAddClass(element, cssClasses) {
if (cssClasses) {
if (cssClasses && element.setAttribute) {
var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
.replace(/[\n\t]/g, " ");

View file

@ -493,6 +493,16 @@ describe('jqLite', function() {
});
it('should ignore comment elements', function() {
var comment = jqLite(document.createComment('something'));
comment.addClass('whatever');
comment.hasClass('whatever');
comment.toggleClass('whatever');
comment.removeClass('whatever');
});
describe('hasClass', function() {
it('should check class', function() {
var selector = jqLite([a, b]);