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

是的,我剛剛得到那。謝謝 –