2015-01-01 22 views
1
調用removeEventLisener時的addEventListener的方法和removeEventListener在全局函數

有很多關於類似主題的問題和答案,但我覺得這是一個稍微不同的問題,其他問題的答案也不太回答這個。我有一個構造函數,它的原型有一個addEventListener,用全局函數once調用。一旦需要成爲全局的,但addEventListener需要在原型的方法中。我將如何刪除事件監聽器,我將once.bind(that)once中的函數放在removeEventListener中?如何在JavaScript

var once = function(event) { 
    removeEventListener("keydown", /*something*/); 
} 
Chomp.prototype.playerMove = function() { 
    var that = this; 
    addEventListener("keydown", once.bind(that)); 
} 

提前感謝! :)

回答

1

在「非嚴格」模式下,你可以使用arguments.callee獲得的一個參考功能once,受限於once.bind(that)。不幸的是,在ES5嚴格模式下,功能已被刪除。

你可以調用一個單獨的函數(它必須被命名,所以它可以傳遞給removeEventListener)處理事件處理程序的解除綁定。

Chomp.prototype.playerMove = function() { 
    var that = this; 
    var local_once = function() { 
     removeEventListener('keydown', local_once); // deregister this function 
     return once.apply(that, arguments);   // invoke global "once" 
    } 
    addEventListener('keydown', local_once); 
} 

[太晚了 - 我才意識到這樣做當然需要修改once,但有除非它存儲的地方,引用您的once.bind(that)產生的功能沒有其它辦法你原來once可以得到它。該解決方案保持「僅調用一次」的邏輯本地到.playerMove]。

1

試試這個更新的代碼:

var once = function(event) { 
    document.body.removeEventListener("keydown", once); 

}

Chomp.prototype.playerMove = function() { 
    document.body.addEventListener("keydown", once); 
} 

你不能在once功能使用once.bind(that)That在函數中是不知道的。並且每個具有綁定的eventlistener只能通過確切的函數調用來移除它,因爲它是如何設置的。如果你要提到once.bind(this)在刪除功能,這將是一個不同的包裝比附加功能並不會刪除該事件。上面的代碼將EventListener附加到body,並在用戶按下某個鍵時將其刪除。

另一種選擇(更好的)是綁定的功能保存到播放器

var once = function(event) { 
    document.body.removeEventListener("keydown", this.keyDownEvent); 

}

Chomp.prototype.playerMove = function() { 
    this.keyDownEvent = once.bind(this); 
    document.body.addEventListener("keydown", this.keyDownEvent); 
}