Posso encontrar eventos vinculados a um elemento com jQuery?

355

Eu vinculo dois manipuladores de eventos neste link:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

Existe alguma maneira de obter uma lista de todos os eventos vinculados a um elemento, neste caso no elemento with id="elm"?

Praveen Prasad
fonte

Respostas:

517

Nas versões modernas do jQuery, você usaria o $._datamétodo para encontrar quaisquer eventos anexados pelo jQuery ao elemento em questão. Observe que este é um método somente de uso interno:

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

O resultado de $._dataserá um objeto que contém os dois eventos que definimos (foto abaixo com a mouseoutpropriedade expandida):

Saída do console por $ ._

Em seguida, no Chrome, você pode clicar com o botão direito do mouse na função manipuladora e clicar em "visualizar definição da função" para mostrar o local exato em que ela está definida no seu código.

Sampson
fonte
59
Isso funciona apenas para elementos vinculados pelos auxiliares do jQuery.
Alex Ciminian
3
@jammypeach Estou tentando sua solução, mas continuo sendo indefinido para o seletor. Eu usei $ ('# elem'). Bind ('click', function () {}); se isso faria diferença.
Marcus
6
@marcus ahhh, woops perdi alguma coisa, desculpe :)$._data(element[0], ‘events’);
totallyNotLizards
16
Hoje em dia é preciso usar: $ ._ data ($ ('# foo') [0]) .events
Donald Taylor
5
$._data()é usado pelo JQuery interno. $.data()é o método público para o usuário. E $.data(element, 'events')funciona bem.
slideshowp2
73

Caso Geral:

  • Clique F12para abrir as Ferramentas de Desenvolvimento
  • Clique na Sourcesguia
  • No lado direito, role para baixo Event Listener Breakpointse expanda a árvore
  • Clique nos eventos que você deseja ouvir.
  • Interaja com o elemento de destino, se eles dispararem, você obterá um ponto de interrupção no depurador

Da mesma forma, você pode:

  • clique com o botão direito do mouse no elemento de destino -> selecione " Inspect element"
  • Role para baixo no lado direito do quadro de desenvolvimento, na parte inferior é ' event listeners'.
  • Expanda a árvore para ver quais eventos estão anexados ao elemento. Não tenho certeza se isso funciona para eventos que são tratados com bolhas (acho que não)
Vali Shah
fonte
3
Concordo que este é o método preferido e é uma solução universal, em vez de depender do jQuery, que pode ou não estar disponível.
deadbabykitten
3
@dead umm ... a pergunta se refere especificamente a jQuery e usa jQuery no exemplo anexo - a resposta só deve ser válido no contexto do jQuery (?)
Código Jockey
3
É útil entender respostas em outros contextos também. Só porque alguém faz uma pergunta específica não significa que a resposta restrita que receberá será a melhor disponível. Especialmente com o jQuery, as pessoas tendem a confiar nele como uma muleta. É importante entender a arquitetura subjacente. Esta resposta mostra que o jQuery nem é necessariamente necessário. A pergunta e o exemplo são vagos demais para conhecer o uso e, portanto, deixam em aberto a interpretação do que poderia ser considerado uma resposta válida.
deadbabykitten
12

Estou adicionando isso para a posteridade; Existe uma maneira mais fácil que não envolve escrever mais JS. Usando o incrível addon firebug para o firefox ,

  1. Clique com o botão direito do mouse no elemento e selecione 'Inspecionar elemento com Firebug'
  2. Nos painéis da barra lateral (mostrados na captura de tela), navegue até a guia Eventos usando a pequena seta>
  3. A guia events mostra os eventos e funções correspondentes para cada evento
  4. O texto ao lado mostra a localização da função

insira a descrição da imagem aqui

kakoma
fonte
11
Isso também está disponível nas ferramentas de desenvolvimento do IE.
devlin carnate 7/09/16
9

Agora você pode simplesmente obter uma lista de ouvintes de eventos vinculados a um objeto usando a função javascript getEventListeners ().

Por exemplo, digite o seguinte no console de ferramentas de desenvolvimento:

// Get all event listners bound to the document object
getEventListeners(document);
ScottyG
fonte
4
Eu acho que essa não é uma função nativa e precisa do seguinte script / dependência: github.com/colxi/getEventListeners Isso deve ser adicionado à resposta, pois é enganoso. Mas obrigado por me levar a esse 'plugin'; Parece legal. :)
Dennis98
6

O plug- in do plugin jQuery Audit deve permitir que você faça isso por meio das Ferramentas de desenvolvimento normais do Chrome. Não é perfeito, mas deve permitir que você veja o manipulador real vinculado ao elemento / evento e não apenas o manipulador genérico do jQuery.

JohnK
fonte
3

Embora isso não seja exatamente específico dos seletores / objetos do jQuery, no FireFox Quantum 58.x, você pode encontrar manipuladores de eventos em um elemento usando as ferramentas de desenvolvimento:

  1. Clique com o botão direito do mouse no elemento
  2. No menu de contexto, clique em 'Inspecionar elemento'
  3. Se houver um ícone 'ev' próximo ao elemento (caixa amarela), clique no ícone 'ev'
  4. Exibe todos os eventos para esse elemento e manipulador de eventos

FF Quantum Dev Tools

Chris22
fonte
11
resposta incrível, especialmente a captura de tela, torna muito mais fácil. Obrigado pelo esforço!
bizi
2

Eu usei algo assim se ($ ._ data ($ ("a.wine-item-link") [0]). Events == null) {... faça algo, ligue os manipuladores de eventos novamente} para verificar se meu elemento estiver vinculado a qualquer evento. Ainda será indefinido (nulo) se você desanexou todos os manipuladores de eventos desse elemento. Essa é a razão pela qual estou avaliando isso em uma expressão if.

Adrian Liew
fonte
2

Observe que os eventos podem ser anexados ao próprio documento, e não ao elemento em questão. Nesse caso, você desejará usar:

$._data( $(document)[0], "events" );

E encontre o evento com o seletor correto :

insira a descrição da imagem aqui

E então veja o manipulador > [[FunctionLocation]]

insira a descrição da imagem aqui

Pikamander2
fonte
0

Quando passo uma consulta DOM complexa para dados $ ._ como este: $._data($('#outerWrap .innerWrap ul li:last a'), 'events')lança indefinidamente no console do navegador.

Então eu tive que usar os dados $ ._ na div pai: $._data($('#outerWrap')[0], 'events')para ver os eventos das tags a. Aqui está um JSFiddle para o mesmo: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/

giri-jeedigunta
fonte
3
A razão para isso é que você está delegando o evento $('#outerWrap'). Os eventos são realmente vinculados a esse elemento, e não às âncoras individuais.
Scottux 14/05