Usando o Chrome, como descobrir a quais eventos estão vinculados a um elemento

148

Vamos supor que eu tenha um link na minha página:

<a href="#" id="foo">Click Here</a>

Não sei mais nada, mas quando clico no link, um alert("bar")é exibido. Então eu sei que em algum lugar, algum código está sendo vinculado #foo.

Como posso encontrar o código que está vinculando o alert("bar")evento click? Estou procurando uma solução com o Chrome.

Obs .: O exemplo é fictício, portanto, não estou procurando uma solução como: "Use XXXXXX e pesquise em todo o projeto" alert (\ "bar \") "). Quero uma solução real de depuração / rastreamento.

FMaz008
fonte

Respostas:

140

Usando o Chrome 15.0.865.0 dev . Há uma seção "Ouvintes de eventos" no painel Elementos:

insira a descrição da imagem aqui

E um "Pontos de interrupção de ouvintes de eventos" no painel Scripts. Use o mouse -> clique no ponto de interrupção e, em seguida, "avance para a próxima chamada de função", mantendo um olho na pilha de chamadas para ver qual função da terra do usuário lida com o evento. Idealmente, você substituiria a versão minificada do jQuery por uma versão não minificada, para que você não precise intervir o tempo todo e utilizá -la sempre que possível.

insira a descrição da imagem aqui

Ionuț G. Stan
fonte
10
Aproximando-me, mas a maioria dos resultados está apontando para a linha 16 de ... jquery.min.js :( (Eu entendo o porquê, não há necessidade de explicar, mas como podemos encontrar quem chamou o método bind () de jQuery?
FMaz008
Essas ferramentas também estão disponíveis no Chrome 12.0.742.100. :) Obrigado !
FMaz008
13
@ Fofo: Você não precisa. Basta clicar no { }símbolo no canto inferior esquerdo ao visualizar js. Magia.
Hannes Schneidermayer
Percorrer o código de despacho de eventos complexos do jQuery é uma grande dor. A resposta do jQuery Audit abaixo ( stackoverflow.com/a/30487583/24267 ) é muito melhor.
mhenry1384
3
Para excluir o jquery da pilha de chamadas, coloque o script em caixa preta: developer.chrome.com/devtools/docs/blackboxing @ IonuțG.Stan, ou mods, você pode atualizar a resposta com uma referência ao blackbox - parece ser uma pergunta comum relevante para esta resposta.
Chris Hynes
47

Você também pode usar o inspetor do Chrome para encontrar eventos anexados de outra maneira, da seguinte maneira:

  1. Clique com o botão direito do mouse no elemento a ser inspecionado ou encontre-o no painel 'Elementos'.
  2. Em seguida, na guia / painel 'Event Listeners', expanda o evento (por exemplo, 'clique')
  3. Expanda os vários subnós para encontrar o que você deseja e, em seguida, procure onde está o subnó 'manipulador'.
  4. Clique com o botão direito do mouse na palavra 'função' e clique em 'Mostrar definição da função'

Isso levará você ao local onde o manipulador foi definido, conforme demonstrado na imagem a seguir, e explicado por Paul Irish aqui: https://groups.google.com/forum/#!topic/google-chrome-developer-tools/NTcIS15uigA

'Mostrar definição da função'

Matty J
fonte
dois anos e ainda a melhor resposta para essa pergunta.
Stuart
16

Experimente a extensão do jQuery Audit ( https://chrome.google.com/webstore/detail/jquery-audit/dhhnpbajdcgdmbbcoakfhmfgmemlncjg ), depois de instalar, siga estas etapas:

  1. Inspecione o elemento
  2. Na nova guia ' jQuery Audit ' expanda a propriedade Events
  3. Escolha o evento que você precisa
  4. Na propriedade manipulador, clique com o botão direito do mouse na função e selecione ' Mostrar definição da função '
  5. Agora você verá o código de associação de eventos
  6. Clique no botão ' Impressão bonita ' para uma visualização mais legível do código
Javier Armendariz
fonte
1
Essa é uma excelente extensão e economiza muito tempo analisando o JavaScript.
Neil Monroe
Costumo constatar que "Ouvintes de eventos" lista "Nenhum ouvinte de eventos" e que selecionar "Pontos de interrupção do ouvinte de eventos"> Mouse> Clique não cria um ponto de interrupção. Este plugin funciona muito bem.
StuartN
@Javier> é uma ótima resposta. Funciona para um mecanismo javascript (não jQuery)?
Mahefa
11

(Mais recente a partir de 2020) Para a versão Chrome Versão 83.0.4103.61 :

Ferramentas do desenvolvedor do Chrome - Listener de eventos

  1. Selecione o elemento que você deseja inspecionar

  2. Escolha a guia Event Listeners

  3. Verifique os ouvintes do Framework para mostrar o arquivo javascript real em vez da função jquery.

lovelyramos
fonte
6

Edit : em vez de minha própria resposta, esta é excelente: Como depurar ligações de eventos JavaScript / jQuery com Firebug (ou ferramenta similar)

As ferramentas de desenvolvedor do Google Chromes têm uma função de pesquisa incorporada na seção de scripts

Se você não estiver familiarizado com esta ferramenta: (apenas no caso)

  • clique com o botão direito do mouse em qualquer lugar da página (no chrome)
  • clique em 'Inspecionar elemento'
  • clique na guia 'Scripts'
  • Barra de pesquisa no canto superior direito

Fazer uma pesquisa rápida pelo #ID deve levá-lo à função de ligação eventualmente.

Ex: pesquisar #foolevaria você para

$('#foo').click(function(){ alert('bar'); })

insira a descrição da imagem aqui

Michael Jasper
fonte
4
Bom começo, mas e se eu tiver 1500 referências a #foo, a maioria delas que não vincula nada, ou no caso de eu ter vários IDs #foo em scripts externos que não são acionados no presente caso?
precisa saber é o seguinte
Ótima pergunta. Na minha experiência, que é onde o processo de depuração humano geralmente começa :)
Michael Jasper
1
Hehe, você está certo, mas a minha pergunta era também sobre o que devo fazer como um ser humano: p
FMaz008
6

Atualização de 2018 - Pode ser útil para futuros leitores:

Não tenho certeza de quando isso foi originalmente introduzido no Chrome. Mas outra maneira (fácil) de fazer isso agora no Chrome é através de comandos do console.

Por exemplo: ( no tipo de console chrome )

getEventListeners($0)

Enquanto $ 0 é o elemento selecionado no DOM.

https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference#0_-_4

insira a descrição da imagem aqui

Kris Hollenbeck
fonte
4

findEventHandlers é um plugin jquery, o código bruto está aqui: https://raw.githubusercontent.com/ruidfigueiredo/findHandlersJS/master/findEventHandlers.js

Passos

  1. Cole o código bruto diretamente no console do chrome (nota: o jquery já deve estar carregado)

  2. Use a seguinte chamada de função: findEventHandlers(eventType, selector);
    para localizar o manipulador eventType do elemento especificado do seletor correspondente.

Exemplo :

findEventHandlers("click", "#clickThis");

Se houver, o manipulador de eventos disponível será exibido abaixo. Você precisa expandir para encontrar o manipulador, clique com o botão direito do mouse na função e selecione show function definition

Veja: https://blinkingcaret.wordpress.com/2014/01/17/quickly-finding-and-debugging-jquery-event-handlers/

uniformizar
fonte
3

Para a versão 52.0.2743.116 do Chrome:

  1. Nas Ferramentas de desenvolvedor do Chrome, abra o painel 'Pesquisar' pressionando Ctrl+ Shift+ F.

  2. Digite o nome do elemento que você está tentando encontrar.

Os resultados para elementos vinculados devem aparecer no painel e indicar o arquivo em que estão localizados.

Eco Fantasma
fonte