[英]JS: Can't remove eventListener for my debounce function
let header = document.getElementById('header');
function logTitle() {
console.log("Logging Title")
}
let debounceFunc = function debounce(fn, delay) {
let newFn;
return function(...args) {
if (newFn) {
clearTimeout(newFn);
}
newFn = setTimeout(() => {
fn(...args)
},delay);
}
}
header.addEventListener('click', debounceFunc(logTitle, 3000));
Tested this and works as expected.对此进行了测试并按预期工作。 Then when I try to remove it is when I have trouble:
然后,当我尝试删除它时,我遇到了麻烦:
header.removeEventListener('click', debounceFunc);
I also tried header.removeEventListener('click', debounceFunc, true)
and header.removeEventListener('click', debounceFunc, false);
我也试过
header.removeEventListener('click', debounceFunc, true)
和header.removeEventListener('click', debounceFunc, false);
but neither are removing it.但两者都没有删除它。
Any ideas what I am doing wrong?任何想法我做错了什么?
EDIT: I also tried originally creating the debounce without setting it to a variable like this and just attached debounce
to the clickEvent but that didn't work when removing either:编辑:我也尝试过最初创建去抖动而不将其设置为这样的变量,并且只是将
debounce
附加到 clickEvent 但是在删除任何一个时都不起作用:
// tried creating function like this as well:
function debounce(fn, delay) {
let newFn;
return function(...args) {
if (newFn) {
clearTimeout(newFn);
}
newFn = setTimeout(() => {
fn(...args)
},delay);
}
}
Your problem is trying to removeEventListener
when listener is anonymous function.当侦听器是匿名
removeEventListener
时,您的问题是尝试删除事件侦听器。 It's impossible.不可能。 However, you can assign return value of
debounceFunc
to a variable, for example my_callback
.但是,您可以将
debounceFunc
的返回值分配给变量,例如my_callback
。 After that, my_callback
becomes a function.之后,
my_callback
变为 function。 Then just pass my_callback
to add/remove EventListener.然后只需将
my_callback
传递给添加/删除 EventListener。
Just use this:只需使用这个:
let header = document.getElementById('header');
function logTitle() {
console.log("Logging Title")
}
let debounceFunc = function debounce(fn, delay) {
let newFn;
return function(...args) {
if (newFn) {
clearTimeout(newFn);
}
newFn = setTimeout(() => {
fn(...args)
},delay);
}
}
let my_callback = debounceFunc(logTitle, 3000);
header.addEventListener('click', my_callback);
And then remove with this function call:然后使用此 function 调用删除:
header.removeEventListener('click', my_callback);
You should save handle for event listener and unbind event listener by handle.您应该保存事件侦听器的句柄并通过句柄取消绑定事件侦听器。 Like this:
像这样:
let header = document.getElementById('header'); function logTitle() { console.log("Logging Title") } let debounceFunc = function debounce(fn, delay) { let newFn; return function(...args) { if (newFn) { clearTimeout(newFn); } newFn = setTimeout(() => { fn(...args) },delay); } } const eventHandler = debounceFunc(logTitle, 300); header.addEventListener('click', eventHandler); document.querySelector('button').addEventListener('click', () => { header.removeEventListener('click', eventHandler); })
<header id="header"> I'm header, click me to debounce function </header> <button> Click me to unbind event handler for header </button>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.