1

我编写了允许用户通过单击来选择和取消选择 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,' ');
    }
}

这是取消全选

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

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

我该如何解决这个问题?为什么它不起作用?

谢谢!

4

1 回答 1

1

尝试更改该for循环:

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

from 的返回值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,' ');
}

或该主题的一些变化。

于 2012-09-13T17:24:10.410 回答