Inspecione manipuladores de eventos anexados para qualquer elemento DOM

107

Existe alguma maneira de visualizar quais funções / código são anexados a qualquer evento para um elemento DOM? Usando Firebug ou qualquer outra ferramenta.

Claudio Redi
fonte
Anexado usando jQuery ou usando DOM nativo?
SLaks
3
@SLaks: Boa pergunta. Anexado usando QUALQUER mecanismo
Claudio Redi

Respostas:

71

Manipuladores de eventos anexados usando tradicional element.onclick= handlerou HTML <element onclick="handler">podem ser recuperados trivialmente a partir da element.onclickpropriedade do script ou do depurador interno.

Os manipuladores de eventos anexados usando addEventListenermétodos de eventos DOM Nível 2 e IEs attachEventnão podem ser recuperados do script. O DOM Nível 3 já propôs element.eventListenerListobter todos os ouvintes, mas não está claro se isso chegará à especificação final. Não há implementação em nenhum navegador hoje.

Uma ferramenta de depuração como extensão do navegador poderia ter acesso a esses tipos de ouvintes, mas não estou ciente de qualquer um que realmente tenha.

Alguns frameworks JS deixam um registro suficiente de associação de eventos para descobrir o que eles têm feito. O Visual Event usa essa abordagem para descobrir ouvintes registrados por meio de algumas estruturas populares.

bobince
fonte
7
Agora existe uma extensão para Firebug chamada EventBug e supostamente um recurso semelhante no chrome / safari. Também farei um link para uma discussão mais popular sobre isso: stackoverflow.com/questions/446892/…
Nickolay
1
No Opera, você pode usar o Opera Dragonfly integrado para isso.
Norill Tempest
Também há uma parte integrada do FireBug (extensão para FireFox) para eventos quando a tag HTML é selecionada.
Musa Haidari
O EventBug está integrado ao FireBug desde a versão 2 (agora há uma guia "Eventos").
Chris Rae
76

O painel de elementos nas ferramentas do desenvolvedor do Google Chrome tem isso desde os lançamentos do Chrome em meados de 2011 e os lançamentos do canal do desenvolvedor do Chrome desde 2010.

Além disso, os ouvintes de evento mostrados para o nó selecionado estão na ordem em que são disparados durante as fases de captura e bolha.

Pressione command+ option+ ino Mac OSX e Ctrl+ Shift+ ino Windows para iniciar no Chrome

captura de tela das ferramentas de desenvolvimento

tuxtitlan
fonte
5
Como o painel de elementos no Chrome faz isso?
thunderboltz
1
Além disso, como podemos encontrar o código que os atribui? Depois de encontrar um manipulador de eventos suspeito usando esta IU, a barra não é larga o suficiente para eu ver o código do manipulador ...
Steven Lu
Acho essa abordagem um tanto confusa ... pelo menos para mim. Quando eu abri o evento, ele só tinha eventos jQuery, meu evento personalizado para aquele elemento específico não aparece. Eu uso $ ._ data para eventos personalizados que atribuo com jQuery. Consulte stackoverflow.com/questions/2008592/…
stack247
2
É possível inspecionar os eventos no windowobjeto, como o messageevento?
Septagrama
8

Chrome Dev Tools anunciou recentemente algumas novas ferramentas para monitorar eventos JavaScript .

TL; DR

Ouça eventos de um determinado tipo usando monitorEvents().

Use unmonitorEvents()para parar de ouvir.

Obtenha ouvintes de um elemento DOM usando getEventListeners().

Use o painel Inspetor de ouvintes de eventos para obter informações sobre ouvintes de eventos.

Encontrar eventos personalizados

Para minha necessidade, descobrindo eventos JS personalizados em código de terceiros, as duas versões a seguir do getEventListeners()foram incrivelmente úteis;

  • getEventListeners(window)
  • getEventListeners(document)

Se você souber a qual nó DOM o listener de evento foi anexado, você passaria isso em vez de windowou document.

Evento Conhecido

Se você sabe o evento que você deseja monitorar por exemplo, clickno corpo do documento, você poderia usar o seguinte: monitorEvents(document.body, 'click');.

Agora você deve começar a ver todos os eventos de clique no document.bodysendo registrado no console.

GFargo
fonte
Eu tentei thisgetEventListeners (document.getElementById ("inputId")); mas retorna inválido, com um tamanho de matriz de 1
verde rico
6

Você pode visualizar eventos diretamente anexados (element.onclick = handler) olhando para o DOM. Você pode visualizar eventos anexados a jQuery no Firefox usando FireBug com FireQuery. Não parece haver nenhuma maneira de ver eventos adicionados por addEventListener usando FireBug. No entanto, você pode vê-los no Chrome usando o depurador do Chrome.

mhenry1384
fonte
6

Você pode usar o Visual Event de Allan Jardine para inspecionar todos os manipuladores de eventos anexados de várias das principais bibliotecas JavaScript em sua página. Funciona com jQuery, YUI e vários outros.

Visual Event é um bookmarklet JavaScript, portanto é compatível com todos os principais navegadores.

Medlock Perlman
fonte
1

Você pode estender seu ambiente javascript para controlar os ouvintes de eventos. Envolva (ou 'sobrecarregue') o método addEventListener () nativo com algum código que possa manter um registro de qualquer ouvinte de evento adicionado a partir de então . Você também teria que estender HTMLElement.prototype.removeEventListener para manter registros que refletem com precisão o que está acontecendo no DOM.

Apenas para fins de ilustração (código não testado) - este é um exemplo de como você 'empacotaria' addEventListener para ter registros dos ouvintes de eventos registrados no próprio objeto:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
Rolf
fonte