javascript - 删除以前添加的类不起作用

标签 javascript

我正在使用 js 向一篇文章添加一个类,一切正常,没问题。但是如果我想删除那个类,这种方法就不起作用了。我不能使用 jQuery。

 document.addEventListener("DOMContentLoaded", function() {
            var blogCard = document.querySelectorAll('[data-role="blogCard"]');
            for (let i = 0; i < blogCard.length; i++) {
                blogCard[i].addEventListener('click', function() {
                    this.classList.add('opened-card');

                    var closeCard = document.querySelectorAll('[data-role="closeCard"]');
                    closeCard[0].addEventListener('click', function() {
                        var pThis = this.parentNode;
                        pThis.classList.remove('opened-card');
                    });

                });
            };

        });
    <div class="card" data-role="blogCard">
        <button data-role="closeCard">Close</button>
    </div>

我已经尝试将“删除”更改为“添加”并且效果很好,它添加了类。但是当我回去删除它时,它不起作用。

最佳答案

因为 click 事件传播到父级,所以这里实际上触发了两个点击处理程序。 button.closeCard 单击处理程序删除类,但 div.blogCard 将其添加回来。 :) 这就是为什么添加类有效,但删除类无效的原因。

要解决这个问题,您可能只是阻止第二个处理程序中的事件传播,或者只是使用 div.blogCard 上设置的组合事件处理程序,根据 事件选择行为。 target(本质上是实现委托(delegate))。像这样:

blogCard[i].addEventListener('click', function(event) {
  if (event.target.getAttribute('data-role') === 'closeCard') {
    this.classList.remove('opened-card');
  }
  else {
    this.classList.add('opened-card');
  }
});

事实上,您可能会考虑使用相同的技术 - 检查目标在 DOM inside 事件处理程序中的位置 - 通过将单个事件处理程序应用于这些卡片的父级(如果有单个父级,类(class)):

// a single event handler set on some 'cardContainer' element
var blogCard = event.target.closest('[data-role="blogCard"]');
if (blogCard) {
  var action = event.target.closest('[data-role="closeCard"]') ? 'remove' : 'add';
  blogCard.classList[action]('opened-card');
}

正如@IronFlare 正确提到的那样,这不仅比在循环中分别为每张卡片执行更高性能和更易于阅读,而且还可以在设置事件处理程序后处理添加到 DOM 的所有卡片。

关于javascript - 删除以前添加的类不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526835/

相关文章:

javascript - 动态显示列名

javascript - 调用 window.print() 时会触发什么事件?

javascript - JQUERY 根据另一个选择元素的输入动态填充 "Select"选项

javascript - 如果值已存在于 Javascript 集合中,如何删除该值

javascript - 页面未在 JavaScript 中加载

javascript - Bootstrap-formhelpers 选择框

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、 bool 值)

javascript - Redux Reducer 正在返回一个 [Object Object] ,但是我想要字符串?

javascript - 如何创建可以在 AngularJS 上使用 Controller 访问的辅助类

javascript - D3.js 水平翻转图