Você já se perguntou por que é tão difícil acionar eventos keydown
ou click
programaticamente em JS puro? Deve ser fácil, certo? Apenas … acione certo?
elem.click(); /* elem has no method click :( */
uhh … ao contrário de elem.focus
ou elem.blur
que são funções e podem ser chamadas, não há métodos elem.click
ou 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 = clickHandler
element.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 ( EventListenerList
Eventos DOM 3), mas ainda não foi implementada por nenhum navegador (setembro de 2012). Até então, não existe um getEventListener
mé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