2014-12-05 216 views
8

我想弄清楚如何監聽JavaScript對象上的所有事件。在JavaScript中監聽所有事件

我知道,我可以添加一些個別事件,這樣

element.addEventListener("click", myFunction); 
element.addEventListener("mouseover", myFunction); 
... 

我試圖找出是否有一個包羅萬象的,我想要做這樣的事情:

// Begin pseudocode 
var myObj = document.getElementById('someID'); 

myObj.addEventListener(/*catch all*/, myFunction); 

function myFunction() { 
    alert(/*event name*/); 
} 
// End pseudocode 
+3

你爲什麼要這麼做? – putvande 2014-12-05 17:42:26

+0

你有沒有想過這個?如果它是可行的或不可行? – hipkiss 2016-08-04 13:30:54

回答

0

你可以使用EventEmitter2它做通配符。像你所說的做一個傳奇的問題是,有這麼多的事件,你可以創建自己的事件。您必須制定一組特定的事件,您正在討論這些事件,然後逐個綁定每個事件。

2

你或許應該選擇你要聽的事件,把它們放到一個數組和遍歷每個:

['click','mouseover'].forEach(function(ev) { 
    el.addEventListener(ev, function() { 
     console.log('event:', ev) 
    }) 
}) 
+0

這現在好像壞了。我試圖找出誰改變了什麼,什麼時候改變,但目前爲止沒有運氣.. – BrendanJefferis 2017-04-17 22:29:12

+1

是的,'Event.prototype'已經改變。無論如何,這是一種氣味,我將它從答案中刪除。 – Mosho 2017-04-18 22:31:08

+1

正確,所以一個好的解決方案將能夠獲得所有事件名稱的列表,有沒有辦法檢索所有可能的事件名稱列表? – Olegzandr 2018-01-02 01:21:00

15

要拿起標元素的事件。

var myObj = document.getElementById('someID'); 
for(var key in myObj){ 
    if(key.search('on') === 0) { 
     myObj.addEventListener(key.slice(2), myFunction) 
    } 
} 

但是@jeremywoertink提到任何其他事件也是可能的。

+0

窗口上的所有事件呢? – Olegzandr 2018-01-02 01:21:49

+1

@ Olegzandr,窗口有什麼問題?只需用'window'替換'myObj'即可。然而,請注意,通過這個,你也可以聽到一些不存在的事件,例如如果有一個全局變量'onetwothree',則上面的代碼將爲事件''etwothree''添加一個監聽器。 (͡°͜ʖ͡°) – 2018-01-11 10:32:56

2

的更現代改寫@羅馬bekkiev的回答是:

Object.keys(window).forEach(key => { 
    if (/on/.test(key)) { 
     window.addEventListener(key.slice(2), event => { 
      console.log(event); 
     }); 
    } 
});