2016-08-31 157 views
0

是否可以將事件添加到窗口上的子對象上,它將接受來自任何位置(如窗口)的事件?將事件偵聽器添加到窗口的子對象中

因此,舉例來說:

window.myVariable.addEventListener('keydown', doKeyDown); 

這樣我可以刪除此特定鍵按下事件,而不移除被貼在車窗等的keydown事件。

這是怎麼回事?

+0

這是什麼'myVariable'?誰將解僱這個'keydown'事件? –

+0

'myVariable'可以是任何東西。我想基本上我想爲特定事件做一個包裝,然後我可以循環並移除它們 –

+0

因此,應該由您的應用程序來觸發這些事件(與瀏覽器相反,就像'onclick'一樣)? –

回答

1

您可以創建一個在「名稱空間」上運行的簡單註冊表。

(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)。

這應該至少讓你開始。

+0

我最終做了一件非常相似的事情。我創建了兩個類,一個用事件數組來管理事件,另一個用來保存有關事件(被添加到數組中)的信息。然後我可以將項目添加到數組中,然後遍歷數組來刪除事件。 –

0

不是真的,儘管您可以將處理程序分配給例如body元素。

這樣我就可以刪除這個特定的按鍵事件,而不需要刪除附加到窗口的其他keydown事件。

雖然這聽起來像是X-Y問題。

removeEventListener要求您指定哪個您要刪除的事件偵聽器。

removeEventListener('keydown', doKeyDown); 

...所以默認行爲是「沒有刪除其他keydown事件」。

相關問題