【问题标题】:Remove item form array but keep event listener从数组中删除项目但保留事件侦听器
【发布时间】:2022-01-14 14:38:17
【问题描述】:

我有一个添加了相同事件侦听器的项数组,我需要从数组中删除一个特定项,但我想保留事件侦听器。

当然我可以单独添加,但我想知道是否有简单的方法。

Here is a pen to show that. 应该在一段时间后从按钮上移除焦点的功能不会在第三个按钮上执行。

为了更清楚,这里是 JavaScript:

const buttons = [...document.querySelectorAll(".button")];
let dropButton;

for (let i = 0; i < buttons.length; i++) {
    buttons[i].addEventListener("click", function () {
        setTimeout(() => { buttons[i].blur(); }, 500);
    });
    
    if(buttons[i].classList.contains("drop")) {
        dropButton = buttons.splice(i, 1);
        i--;
    }
}

感谢您的帮助:)

【问题讨论】:

  • 那么第三个按钮已经不在buttons数组里面了,你有没有考虑在事件函数里面使用this来实现模糊?
  • 不,我没有。谢谢!

标签: javascript arrays event-listener


【解决方案1】:

事件监听器确实保持连接,但是当按下“dropped”按钮时,处理程序会模糊错误的按钮。这是因为您的处理程序通过不再有效的索引访问buttons[i]

以下是您的处理程序可能的其他三种解决方案:

  // assigning the button to a closure scoped constant
  const b = buttons[i];
  buttons[i].addEventListener("click", function () {
    setTimeout(() => {b.blur();}, 500);
  })

// the "this" context in the handler is the button
buttons[i].addEventListener("click", function () {
  setTimeout(() => { this.blur();}, 500);
})

// the handler get and event whose "target" key is the button
buttons[i].addEventListener("click", function (event) {
   setTimeout(() => {event.target.blur();}, 500);
})

【讨论】:

  • 简洁明了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2020-09-04
  • 2022-08-03
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多