Eu tenho uma página onde alguns ouvintes de eventos estão anexados às caixas de entrada e caixas de seleção. Existe uma maneira de descobrir quais ouvintes de eventos estão observando um nó DOM específico e para qual evento?
Os eventos são anexados usando:
- Protótipos
Event.observe
; - DOM's
addEventListener
; - Como atributo do elemento
element.onclick
.
javascript
events
dom
Navneet
fonte
fonte
element.addEventListener(type, callback, [bubble])
, enquantoelement.onclick = function
sobrescrevem toda vez que você atribuir.Respostas:
Se você apenas precisar inspecionar o que está acontecendo em uma página, tente o bookmarklet Visual Event .
Atualização : Evento Visual 2 disponível.
fonte
EventBug
plugin do Firebug .Depende de como os eventos estão anexados. Para supor ilustração, temos o seguinte manipulador de cliques:
Vamos anexá-lo ao nosso elemento usando métodos diferentes, alguns que permitem inspeção e outros que não.
Método A) manipulador de eventos único
Método B) manipuladores de vários eventos
Método C): jQuery
1.3.x
1.4.x (armazena o manipulador dentro de um objeto)
(Veja
jQuery.fn.data
ejQuery.data
)Método D): Protótipo (confuso)
1.5.x
1.6 a 1.6.0.3, inclusive (ficou muito difícil aqui)
1.6.1 (pouco melhor)
fonte
addEventListener
?.data('events')
como antes. Para acessar os dados internos do evento, use$._data(elem, 'events')
. Observe que essa função está marcada como "somente para uso interno" na fonte do jQuery, portanto, não há promessas de que sempre funcione no futuro, mas acredito que funcionou desde o jQuery 1.7 e ainda funciona.Suporte
getEventListeners(domElement)
para Chrome, Firefox, Vivaldi e Safari no console das Ferramentas do desenvolvedor.Para a maioria dos propósitos de depuração, isso pode ser usado.
Abaixo está uma referência muito boa para usá-lo: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
fonte
getEventListeners(object)
obj getEventListeners()
var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString())
. Altere "foco" para o evento que você deseja inspecionar e o número se houver vários ouvintes no mesmo evento.getEventListeners($0)
obterá os ouvintes do evento para o elemento em que você se concentrou nas ferramentas de desenvolvimento do Chrome. Eu uso isso o tempo todo. O amor não ter que usar funções querySelector ou get__By_O WebKit Inspector nos navegadores Chrome ou Safari agora faz isso. Ele exibirá os ouvintes de evento para um elemento DOM quando você o selecionar no painel Elementos.
fonte
É possível listar todos os ouvintes de eventos em JavaScript: não é tão difícil; você apenas precisa hackear o
prototype
método dos elementos HTML ( antes de adicionar os ouvintes).Agora todo elemento âncora (
a
) terá umalastListenerInfo
propriedade que contém todos os seus ouvintes. E funciona até para remover ouvintes com funções anônimas.fonte
Node.prototype
? ÉHTMLAnchorElement
daí que herda.addEventListener
de qualquer maneira.Use getEventListeners no Google Chrome :
fonte
(Reescrevendo a resposta desta pergunta, pois ela é relevante aqui.)
Ao depurar, se você quiser apenas ver os eventos, eu recomendo ...
Se você quiser usar os eventos em seu código e estiver usando o jQuery antes da versão 1.8 , poderá usar:
para receber os eventos. A partir da versão 1.8, o uso de .data ("events") é descontinuado (consulte este bilhete de bug ). Você pode usar:
Outro exemplo: escreva todos os eventos de clique em um determinado link para o console:
(veja http://jsfiddle.net/HmsQC/ para um exemplo de trabalho)
Infelizmente, o uso de dados $ ._ não é recomendado, exceto para depuração, pois é uma estrutura interna do jQuery e pode mudar em versões futuras. Infelizmente, não conheço outro meio fácil de acessar os eventos.
fonte
$._data(elem, "events")
parece não funcionar com o jQuery 1.10, pelo menos para eventos registrados usando$(elem).on('event', ...)
. Alguém sabe como depurar esses?$._data
pode precisar ser um elemento e não um objeto jQuery. Então, eu preciso corrigir o meu exemplo acima para ser #console.log($._data($myLink[0], "events").click);
1:
Prototype.observe
usa Element.addEventListener (consulte o código-fonte )2: Você pode substituir
Element.addEventListener
para lembrar os ouvintes adicionados (a propriedade útilEventListenerList
foi removida da proposta de especificação do DOM3). Execute este código antes que qualquer evento seja anexado:Leia todos os eventos por:
E não se esqueça de substituir
Element.removeEventListener
para remover o evento da customizaçãoElement.eventListenerList
.3: a
Element.onclick
propriedade precisa de cuidados especiais aqui:4: não esqueça o
Element.onclick
atributo content: estas são duas coisas diferentes:Então você precisa lidar com isso também:
O bookmarklet Visual Event (mencionado na resposta mais popular) rouba apenas o cache do manipulador de biblioteca personalizado:
A substituição de elemento pode ser questionável (ou seja, porque existem alguns recursos específicos do DOM, como coleções ao vivo, que não podem ser codificadas em JS), mas fornece suporte a eventListenerList de forma nativa e funciona no Chrome, Firefox e Opera (não funciona no IE7 )
fonte
Você pode agrupar os métodos DOM nativos para gerenciar ouvintes de eventos colocando isso na parte superior do seu
<head>
:H / T @ les2
fonte
As ferramentas de desenvolvedor do Firefox agora fazem isso. Os eventos são mostrados clicando no botão "ev" à direita da exibição de cada elemento, incluindo eventos jQuery e DOM .
fonte
Se você possui o Firebug , pode
console.dir(object or array)
imprimir uma boa árvore no log do console de qualquer escalar, matriz ou objeto JavaScript.Tentar:
ou
fonte
Solução totalmente funcional com base na resposta de Jan Turon - se comporta como
getEventListeners()
no console:(Há um pequeno bug com duplicatas. De qualquer maneira, não quebra muito.)
Uso:
someElement.getEventListeners([name])
- retornar lista de ouvintes de eventos, se o nome estiver definido, retornar matriz de ouvintes para esse eventosomeElement.clearEventListeners([name])
- remova todos os ouvintes de eventos, se o nome estiver definido, remova apenas os ouvintes desse eventofonte
body
edocument
.O Opera 12 (que não é o mais recente mecanismo do Chrome Webkit) o Dragonfly tem isso há um tempo e é obviamente exibido na estrutura do DOM. Na minha opinião, é um depurador superior e é a única razão pela qual ainda uso a versão baseada no Opera 12 (não há versão v13, v14 e o v15 Webkit ainda não possui o Dragonfly)
fonte
Maneira do protótipo 1.7.1
fonte
Recentemente, eu estava trabalhando com eventos e queria exibir / controlar todos os eventos em uma página. Tendo analisado as possíveis soluções, decidi seguir meu próprio caminho e criar um sistema personalizado para monitorar eventos. Então, eu fiz três coisas.
Primeiro, eu precisava de um contêiner para todos os ouvintes de eventos na página: esse é o
EventListeners
objeto. Ele tem três métodos úteis:add()
,remove()
eget()
.Em seguida, eu criei um
EventListener
objeto para armazenar as informações necessárias para o evento, ou seja:target
,type
,callback
,options
,useCapture
,wantsUntrusted
, e acrescentou um métodoremove()
para remover o ouvinte.Por fim, estendi os métodos nativo
addEventListener()
eremoveEventListener()
para fazê-los funcionar com os objetos que criei (EventListener
eEventListeners
).Uso:
addEventListener()
cria umEventListener
objeto, adicionaEventListeners
e retorna oEventListener
objeto, para que possa ser removido mais tarde.EventListeners.get()
pode ser usado para visualizar os ouvintes na página. Ele aceita umaEventTarget
ou uma sequência (tipo de evento).Demo
Digamos que queremos conhecer todos os ouvintes de eventos nesta página atual. Podemos fazer isso (supondo que você esteja usando uma extensão do gerenciador de scripts, Tampermonkey neste caso). O script a seguir faz isso:
E quando listamos todos os ouvintes, ele diz que existem 299 ouvintes de eventos. "Parece" que existem algumas duplicatas, mas não sei se são realmente duplicatas. Nem todo tipo de evento é duplicado; portanto, todos esses "duplicados" podem ser um ouvinte individual.
Código pode ser encontrado no meu repositório. Eu não queria publicá-lo aqui, porque é bastante longo.
Atualização: parece não funcionar com o jQuery. Quando examino o EventListener, vejo que o retorno de chamada é
Eu acredito que isso pertence ao jQuery e não é o retorno de chamada real. O jQuery armazena o retorno de chamada real nas propriedades do EventTarget:
Para remover um ouvinte de evento, o retorno de chamada real precisa ser passado para o
removeEventListener()
método Portanto, para fazer isso funcionar com o jQuery, ele precisa de mais modificações. Eu posso consertar isso no futuro.fonte
Eu estou tentando fazer isso no jQuery 2.1, e com o
$().click() -> $(element).data("events").click;
método " " não funciona.Percebi que apenas as funções $ ._ data () funcionam no meu caso:
fonte
Existe uma boa extensão de eventos jQuery :
( fonte do tópico )
fonte
alterar essas funções permitirá que você registre os ouvintes adicionados:
leia o resto dos ouvintes com
fonte