2017-07-27 107 views
2

我有一个函数begin,它声明了一个处理函数为check的addEventListener。现在,在check内部满足特定条件时,我想要移除eventListener。从处理函数中删除窗口事件监听器

我的代码:

function begin(data){ 
    //code 
    window.addEventListener('keyUp', check(data)); 
} 

function check(data){ 
    return function check1(event){ 
     //code 
     if(condition) window.removeEventListener('keyUp', check(data)); 
    } 
} 

一切工作正常但不删除EventListener

+2

的可能的复制[如何removeEventListener这是使用封闭加入?](https://stackoverflow.com/questions/19774202/how-to-removeeventlistener-that-was-added-using-closure) –

+0

Psst,它是removeEventListener(),而不是removeListener():)另外:阅读回答。 –

回答

3

您必须使处理程序的check(data)响应函数具有唯一性,例如将其传递给变量。否则,您每次拨打check(data)时都会收到另一个功能,并尝试删除错误的功能。

var handler; 

function begin(data) { 
    handler = check(data); 
    window.addEventListener('keyUp', handler); 
} 

function check(data) { 
    return function check1(event) { 
     if(condition) { 
      window.removeEventListener('keyUp', handler); 
     } 
    } 
} 
+0

不应该是removeEventListener? – Metaphox

+0

当然,谢谢。只是从问题中复制代码... @Metaphox – eisbehr

+0

在这个特定的例子中,你不需要全局变量。你可以使用'check1'而不是'handler',因为每次调用check都会有所不同。 –

3

check1将永远为check每次调用不同的功能,这样你就可以使用window.removeEventListener('keyup', check1)删除自身:

function begin(data) { 
    //code 
    window.addEventListener('keyup', check(data)); 
} 

function check(data) { 
    return function check1(event) { 
    if(condition) { 
     window.removeEventListener('keyup', check1); 
    } 
    } 
} 
+0

哇。这个也工作。现在我很困惑,因为艾斯贝尔的答案也有效。我应该将哪一个标记为最佳答案? :D –

+2

我为这一票投了票,但其他家伙有点少,所以你可以喂另一个,D –

+0

你的更好,因为它使用什么已经可用^ _ ^采取+1 – Leathan

1

正如其他人所指出的处理函数是不是check,所以你不能删除它。处理函数是函数检查返回。

为了更好地理解正在发生的事情,您可以键入。

check().prototype.constructor.name // 'check' 
check.prototype.constructor.name // 'check1' 
+0

是的,我刚刚得到那。谢谢 –