是否可以將事件添加到窗口上的子對象上,它將接受來自任何位置(如窗口)的事件?將事件偵聽器添加到窗口的子對象中
因此,舉例來說:
window.myVariable.addEventListener('keydown', doKeyDown);
這樣我可以刪除此特定鍵按下事件,而不移除被貼在車窗等的keydown事件。
這是怎麼回事?
是否可以將事件添加到窗口上的子對象上,它將接受來自任何位置(如窗口)的事件?將事件偵聽器添加到窗口的子對象中
因此,舉例來說:
window.myVariable.addEventListener('keydown', doKeyDown);
這樣我可以刪除此特定鍵按下事件,而不移除被貼在車窗等的keydown事件。
這是怎麼回事?
您可以創建一個在「名稱空間」上運行的簡單註冊表。
(function() {
var register = {};
function addNamedListener(namespace, eventType, callback) {
register[namespace] = register[namespace] || [];
register[namespace].push({
eventType: eventType,
callback: callback
});
window.addEventListener(eventType, callback);
}
function removeNamedListener(namespace) {
register[namespace].forEach(function(event) {
window.removeEventListener(event.eventType, event.callback);
});
}
window.WindowEvents = {
addNamedListener: addNamedListener,
removeNamedListener: removeNamedListener
}
})();
// Attach a general window event to the actual window
window.addEventListener('click', function(e) {
console.log(e.target);
});
// Attach a namedspaced event
WindowEvents.addNamedListener('windowClicks', 'click', function(e) {
console.log(e.target);
});
// Attach another event to the same namespace
WindowEvents.addNamedListener('windowClicks', 'click', function(e) {
console.log(e.clientX);
});
// Attach a new event to a different namespace
WindowEvents.addNamedListener('down', 'mousedown', function(e) {
console.log('Mouse down occurred');
});
<div>Click Me</div>
然後,當你準備好擺脫在「命名空間」的活動,你只需做到這一點:
WindowEvents.removeNamedListener('windowClicks');
這將使原來的窗口事件以及創建的其他名稱空間事件(down
)。
這應該至少讓你開始。
我最終做了一件非常相似的事情。我創建了兩個類,一個用事件數組來管理事件,另一個用來保存有關事件(被添加到數組中)的信息。然後我可以將項目添加到數組中,然後遍歷數組來刪除事件。 –
不是真的,儘管您可以將處理程序分配給例如body元素。
這樣我就可以刪除這個特定的按鍵事件,而不需要刪除附加到窗口的其他keydown事件。
雖然這聽起來像是X-Y問題。
removeEventListener
要求您指定哪個您要刪除的事件偵聽器。
removeEventListener('keydown', doKeyDown);
...所以默認行爲是「沒有刪除其他keydown事件」。
這是什麼'myVariable'?誰將解僱這個'keydown'事件? –
'myVariable'可以是任何東西。我想基本上我想爲特定事件做一個包裝,然後我可以循環並移除它們 –
因此,應該由您的應用程序來觸發這些事件(與瀏覽器相反,就像'onclick'一樣)? –