【问题标题】:removeClass function doesn't work properlyremoveClass 功能无法正常工作
【发布时间】:2012-09-13 17:21:15
【问题描述】:

我编写了允许用户通过单击来选择和取消选择 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,而只会取消选择其中的一些。

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

谢谢!

【问题讨论】:

  • 我不想,我想练习 vanilla javascript,不要忘记如何编写它,也不想加载很多不需要的功能。
  • 很公平。 jQuery 是一个轻量级框架,它使事情变得更容易。例如,$('p').removeClass('myClass yourClass') 参考。 api.jquery.com/removeClass
  • 是的,我知道如何在 jquery 中做到这一点,但根本不想要。我没有最后期限,所以我并不着急,通过使用 vanilla js,我有机会做得更好。

标签: javascript removeclass


【解决方案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() 也没有任何意义,因为如果类字符串不存在,替换将不会做任何事情。

edit — 在评论中指出,这不适用于嵌入连字符的类名,这是一种常见的约定。如果您需要处理这个问题,那么我认为这会起作用:

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

或该主题的一些变体。

【讨论】:

  • 为什么倒退可以避免问题?我还有一个类似的功能也可以转发...非常感谢您的帮助,但如果不是问题,我希望得到更深入的解释。
  • 当你向前增加“i”时,你会跳过一些。为什么?因为每次调用“removeClass()”都会使列表缩短 1。因此,您只需从列表的每个其他元素中删除该类。换句话说,从位置 0 的元素中删除类后,它将不再在列表中,而位置 1 的元素将位于位置 0。如果将“i”增加到 1,你跳过那个元素。
  • 我相信对于包含破折号的类名,使用 \\b 会失败,例如非常愚蠢的班级。至少这是我在 IE 中看到的。
  • @Will 嘿,好点子-我会在找到解决该问题的好方法后立即更新答案:-)
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 2017-09-23
  • 2013-11-06
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多