removeClass函数无法正常工作

时间:2012-09-13 17:21:16

标签: javascript removeclass

我编写的函数允许用户通过单击选择和取消选择div。现在,我试图做的是一个函数,一旦按下 a ,取消选择所有内容,但它只取消选择我的div的一些。这是代码:

var divs = document.getElementsByClassName('fuori');
for(i = 0, j = divs.length; i < j; i++){
 divs[i].addEventListener('click', function(){
    if(!hasClass(this, 'selected')){
    this.className = this.className + " selected";
} else {
    removeClass(this, 'selected');
}
});
}

removeClass函数就是这个

function removeClass(ele,cls) {
    if (hasClass(ele,cls)) {
        var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
        ele.className=ele.className.replace(reg,' ');
    }
}

这是deselectAll

function deselectAll(){
    var selected = document.getElementsByClassName('selected');
    alert(selected.length);
    for (i = 0; i < selected.length; i++){
        removeClass(selected[i], 'selected');
    }
}

通过单击无缝选择和取消选择,但是当我选择一些div并按 a 时,它不会取消选择每个div,而只取消其中的一些。

我怎么能解决这个问题?为什么不起作用?

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试更改for循环:

for (var i = selected.length; --i >= 0; removeClass(selected[i], 'selected'));

getElementsByClassName()的返回值是NodeList,而不是数组,它是“实时”的。这意味着当您通过删除类来更改DOM时,您也正在更改列表。

通过倒退,你可以避免这个问题。你也可以这样做:

while (selected.length) removeClass(selected[0], 'selected');

顺便说一句,你用来删除类的正则表达式可能更简单:

function removeClass(ele,cls) {
    var reg = new RegExp('\\b' + cls + '\\b', 'g');
    ele.className=ele.className.replace(reg,' ');
}

在JavaScript正则表达式中,\b表示“单词边界”。此外,没有必要调用hasClass(),因为如果没有类字符串,替换就不会做任何事情。

编辑 - 在评论中指出,这不适用于带有嵌入连字符的类名,这是一种常见的约定。如果你需要解决这个问题,那么我认为这样可行:

function removeClass(ele,cls) {
    var reg = new RegExp('\\b' + cls.replace(/-/g, '\\b-\\b') + '\\b', 'g');
    ele.className=ele.className.replace(reg,' ');
}

或该主题的一些变体。