首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从函数中删除eventListener

问无法从函数中删除eventListener
EN

Stack Overflow用户
提问于 2018-10-29 19:58:07
回答 3查看 105关注 0票数 0

我调用一个函数,其中包含一个"if / else“语句,该语句根据作为参数传递的布尔值添加或移除侦听器。

我的问题是不能通过调用相同的函数来删除先前添加的侦听器。

我错过了什么?

代码语言:javascript
复制
function listenerTest(handler) {
    if(handler) {
        window.addEventListener("click", clickFn);
    }
    else {
        window.removeEventListener("click", clickFn);
    }

    function clickFn(event) {
        console.log(event)
    }
}        

listenerTest(true);  

window.setTimeout(listenerTest, 5000, false);  
   // call the "listenerTest" function 5 seconds later with "false" argument does NOT remove the listener 

我做过多次测试,有趣的是,这是可行的

代码语言:javascript
复制
function listenerTest(handler) {
    if(handler) {
        window.addEventListener("click", clickFn);      // listener added
        window.removeEventListener("click", clickFn);   // and removed right after in the same block scope
    }

    function clickFn(event) {
        console.log(event)
    }
}        

listenerTest(true); 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-29 20:03:51

删除clickFn并将其置于listenerTest的范围之外。它每次调用该函数时都会创建一个新实例,因为clickFn被挂起到listenerTest函数的顶部。

代码语言:javascript
复制
function clickFn(event) {
  console.log(event)
}

function listenerTest(handler) {
    if(handler) {
        window.addEventListener("click", clickFn);
    }
    else {
        window.removeEventListener("click", clickFn);
    }
}        

listenerTest(true);  

window.setTimeout(listenerTest, 5000, false); 
票数 1
EN

Stack Overflow用户

发布于 2018-10-29 20:12:34

这是因为每次函数'listenerTest‘被调用时,都会为函数'clickFn’分配一个新的内存地址,所以当您尝试删除它时,它是一个与将它添加到事件侦听器时不同的函数。

票数 1
EN

Stack Overflow用户

发布于 2018-10-29 20:21:19

您可以在检查侦听器是否存在之前使用条件(True),getComponentListeners可能很有用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53052904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档