Obter uma lista de seus eventListeners para que você possa acioná-los programaticamente

Você já se perguntou por que é tão difícil acionar eventos keydownou clickprogramaticamente em JS puro? Deve ser fácil, certo? Apenas … acione certo?

elem.click();   /* elem has no method click :( */

uhh … ao contrário de elem.focusou elem.blurque são funções e podem ser chamadas, não há métodos elem.clickou elem.keydown.

Isso faz sentido já que .. meio que … vamos pensar.

Em vez de disparar o evento, o que queremos é que todos os eventListeners sejam acionados. Vamos obter a lista de eventListeners e disparar cada um! Isso deve funcionar! … certo?

var myElement = document.getElementById('foo');
var myKeyDownEvents = getEventListeners(myElement, 'keydown');
myKeyDownEvents
.forEach( function(keyDownEvent) {
keyDownEvent
.call();
});

/* what would getEventListeners look like? */
var getEventListeners = function(elem, type) {
if (elem.eventListenerList) {
return elem.eventListenerList;
}else {
/* derp?!*/
}
}

O problema é que obter a lista de ouvintes de evento em um elemento é atualmente impossível .. a menos que – como toda boa pergunta StackOverflow JS – você apenas use jQuery !!.

O que? Seriamente! Não consigo obter o eventListenerList a menos que use jQuery! Por quê?
jQuery, YUI, Moo etc. mantém uma cópia dos eventListeners quando você os adiciona aos elementos para que você tenha acesso a uma lista. Portanto, para essas bibliotecas:

var getEventListeners = function(elem, type) {
return getFromGlobalCache(elem, type);
}

Ewww … alguma solução?
Se você puder colocar tudo em um único método e evitar o uso addEventListener(não recomendado em geral), poderá atribuir o método único diretamente à propriedade do elemento . Por exemplo, ou .on*element.onclick = clickHandlerelement.onkeydown = keyDownHandler

e se eu só quiser ver meus eventListeners
Isso é mais fácil! Se você só precisa inspecionar, o inspetor do Chrome / Webkit permite que você veja os eventos.

O Futuro
De acordo com os eventos DOM 3, quando você usou addEventListener, deveria haver uma lista de ouvintes de eventos ( EventListenerListEventos DOM 3), mas ainda não foi implementada por nenhum navegador (setembro de 2012). Até então, não existe um getEventListenermétodo fácil . Se você deseja acionar eventos programaticamente, mantenha uma cópia de uma lista globalmente ou use uma biblioteca.

Leitura adicional
http://stackoverflow.com/a/447106/1361988
https://github.com/jquery/jquery/blob/master/src/event.js
http://stackoverflow.com/questions/7810534/have- any-browsers-driven-the-dom3-eventlistenerlist
http://www.w3.org/TR/2001/WD-DOM-Level-3-Events-20010823/events.html#Events-EventListenerList