简体   繁体   English

JS:无法为我的 debounce function 删除 eventListener

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM