删除带有额外参数的事件侦听器

莎拉·瑞

这是我正在使用的事件侦听器:

const eventHandler = (word, e) => {
    if(isAnimating && duplicates.includes(word.innerHTML)) return; 
    if(String.fromCharCode(e.which) == word.innerHTML && !distWords.includes(word)) {
        move(word);
    } 
}
words.forEach(word => {
    window.addEventListener("keypress", eventHandler.bind(null, word));
});  

问题是我无法删除监听器,我使用了这样的东西,但没有运气:

removeIT = () => {
        words.forEach(word => {
            window.removeEventListener("keypress", eventHandler.bind(null, word));
        }); 
}

如何有效地删除listers?

沙丁鱼

如果您想继续使用此模式,您将需要存储对每个绑定函数的引用并遍历它们以删除侦听器。

const words_listeners = [];

words.forEach(word => {
    const handler = eventHandler.bind(null, word);
    window.addEventListener("keypress", handler);
    words_listeners.push(handler);
});  

removeIT = () => {
    words_listeners.forEach(handler => {
        window.removeEventListener("keypress", handler);
    }); 
}

下面的代码片段将click侦听器附加到按钮,因此还需要存储侦听器所附加的元素,但在您的情况下,由于您附加到窗口,因此不需要。基本上,在您附加侦听器的循环中,创建绑定函数并将其分配给一个变量,用它附加您的侦听器,然后将其推送到一个可用于稍后删除侦听器的数组。

const buttons = document.querySelectorAll('.word')
const word_listeners = [];

const eventHandler = (word, e) => {
    console.log(word)
}

buttons.forEach(button => {
    const handler = eventHandler.bind(null, button.textContent);
    button.addEventListener('click', handler);
    word_listeners.push([button, handler]);
}); 

function remove_listeners() {
  word_listeners.forEach(([button, handler]) => button.removeEventListener('click', handler));
}

document.getElementById('remove').addEventListener('click', remove_listeners);
<button type="button" class="word">One</button>
<button type="button" class="word">Two</button>
<button type="button" class="word">Three</button>

<button type="button" id="remove">Remove listeners</button>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

添加带有参数的事件侦听器,然后将其删除

使用带有局部作用域变量的匿名函数删除事件侦听器

JavaScript - 使用带有 setTimeout 函数的事件侦听器

删除所有特定类型的事件侦听器

Javascript删除“焦点”事件侦听器

无法删除 touchmove 事件侦听器

无法删除(绑定的)事件侦听器

删除事件侦听器as3

无法删除事件侦听器

如何删除事件侦听器

电子:删除beforeunload事件侦听器

如何使用带有事件学说的事件侦听器更改相关实体

将带有事件侦听器的元素传递给模板事件内的appendChild

使用 JavaScript 的事件委托设置删除事件侦听器的有效方法是什么

如果回调是参数化箭头函数,如何删除事件侦听器

使用参数承载功能添加和删除事件侦听器

删除所有提交的侦听器

与根本不删除事件侦听器相比,添加和删除事件侦听器是否更有效?

在删除元素之前是否需要删除事件侦听器?

如何在 Javascript 中添加带有 HTML 模板文字的事件侦听器?

带有 react-native-image-zoom-viewer 的后退按钮事件侦听器

使用键值对数组遍历多个按钮以添加带有循环的事件侦听器

带有远程JanusGraph的变异侦听器事件策略引发序列化异常

尝试获取资源时,带有CLICK事件侦听器的Javascript API FETCH:TypeError:NetworkError

带有匿名函数的事件侦听器(typeError ,toggle undefined)

具有内部和外部参数的Vue事件侦听器

删除DOM对象上的所有事件侦听器

如何从具有匿名功能的div中删除事件侦听器

当游戏在战舰上结束时,如何从所有<tds>中删除事件侦听器?