Preciso descobrir quais manipuladores de eventos estão registrados sobre um objeto.
Por exemplo:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
tem clique e mouseover registrado.
Existe uma função para descobrir isso e possivelmente interagir com os manipuladores de eventos?
Se não for possível em um objeto jQuery através de métodos adequados, é possível em um objeto DOM simples?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Respostas:
A partir do jQuery 1.8, os dados do evento não estão mais disponíveis na "API pública" para dados. Leia esta postagem do blog jQuery . Agora você deve usar isso:
elem
deve ser um elemento HTML, não um objeto jQuery ou seletor.Observe que esta é uma estrutura interna, 'privada' e não deve ser modificada. Use isso apenas para fins de depuração.
Nas versões mais antigas do jQuery, talvez você precise usar o método antigo, que é:
fonte
$._data($(elem).get(0), "events")
handler: function () {
dentro da propriedade click. Eu tive que clicar duas vezes na parte da função para expandir e mostrar o conteúdo completo da função.var events = (jQuery._data || jQuery.data)(elem, 'events');
Você pode fazer isso rastreando os eventos (a partir do jQuery 1.8+), assim:
Aqui está um exemplo com o qual você pode brincar:
fonte
jQuery._data( jQuery("#el")[0], "events" );
em vez do método 'dados públicos':jQuery("#el").data("events")
. Oevents
objeto realmente não foi armazenado em.data()
por um longo tempo, nós aparadas alguns bytes de código por querer retirar esta "proxy" da "API pública"Para o jQuery 1.8+, isso não funcionará mais porque os dados internos são colocados em um objeto diferente.
A última maneira não oficial (mas funciona também nas versões anteriores, pelo menos na versão 1.7.2) agora é:
$._data(element, "events")
O sublinhado ("_") é o que faz a diferença aqui. Internamente, está chamando
$.data(element, name, null, true)
, o último (quarto) parâmetro é interno ("pvt").fonte
jQuery._data( element, "events" )
é a maneira 'correta' de obter essas informações agora.Plugue sem vergonha, mas você pode usar o findHandlerJS
Para usá-lo, basta incluir findHandlersJS (ou simplesmente copiar e colar o código javascript bruto na janela do console do chrome) e especificar o tipo de evento e um seletor jquery para os elementos nos quais você está interessado.
Para o seu exemplo, você pode encontrar rapidamente os manipuladores de eventos mencionados, fazendo
É isso que é retornado:
O elemento real em que o manipulador de eventos foi registrado
matriz de eventos com informações sobre os manipuladores de eventos jquery para o tipo de evento em que estamos interessados (por exemplo, clique, altere etc.)
Método real do manipulador de eventos que você pode ver clicando com o botão direito do mouse e selecionando Mostrar definição de função
O seletor fornecido para eventos delegados. Estará vazio para eventos diretos.
Lista com os elementos que esse manipulador de eventos tem como alvo. Por exemplo, para um manipulador de eventos delegados registrado no objeto de documento e direcionado a todos os botões em uma página, essa propriedade listará todos os botões na página. Você pode passar o mouse e vê-los realçados no chrome.
Você pode tentar aqui
fonte
Eu uso o plugin eventbug para firebug para esse fim.
fonte
Combinei as duas soluções de @jps em uma função:
Mas cuidado, essa função pode retornar apenas eventos que foram definidos usando o próprio jQuery.
fonte
A partir da versão 1.9, não há maneira documentada de recuperar os eventos, além de usar o plug-in Migrar para restaurar o comportamento antigo. Você pode usar o método _.data () como o jps menciona, mas esse é um método interno. Portanto, faça a coisa certa e use o plug-in Migrar se precisar dessa funcionalidade.
Na documentação do jQuery em
.data("events")
fonte
jQuery._data( elem, "events" );
...Para verificar se há eventos em um elemento:
Por exemplo:
ou
Exemplo completo:
Uma maneira mais completa de verificar, que inclui ouvintes dinâmicos, instalados com $ (document) .on
Exemplo de uso:
fonte
getEvents
método é muito bom, mas o fato é que ele fornece entradas duplicadas no IE11 (eu sei, o IE novamente, mas a empresa precisa dele ...). EDIT: $ ._ data contém eventos duplicados para o elemento, embora no FF não contenha nenhum ... Mundo estranho do IE. Mas é importante estar atento a essa possibilidade de ter eventos duplicados.Criei um seletor jQuery personalizado que verifica o cache do jQuery de manipuladores de eventos atribuídos, bem como elementos que usam o método nativo para adicioná-los:
Exemplo:
Isso retornará elementos que possuem um manipulador de cliques anexado a eles.
fonte
Em um navegador moderno com ECMAScript 5.1 /
Array.prototype.map
, você também pode usarno console do navegador, que imprimirá a origem dos manipuladores, delimitados por vírgula. Útil para olhar o que está acontecendo em um evento específico.
fonte
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Não detectado TypeError: Não é possível ler a propriedade 'EVENT_NAME' de indefinida em <anonymous>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
é uma sequência, não um elemento DOM.Os eventos podem ser recuperados usando:
ou jQuery 1.8+:
Nota: Eventos limitados usando
$('selector').live('event', handler)
podem ser recuperados usando:fonte
Devo dizer que muitas das respostas são interessantes, mas recentemente tive um problema semelhante e a solução foi extremamente simples, seguindo o caminho do DOM. É diferente porque você não itera, mas mira diretamente no evento que precisa, mas abaixo darei uma resposta mais geral.
Eu tive uma imagem em uma fileira:
E essa imagem tinha um manipulador de eventos de clique anexado a ela:
Minha intenção era expandir a área clicável para toda a linha, então primeiro obtive todas as imagens e linhas relativas:
Agora, na linha de resposta real, fiz o seguinte, dando uma resposta à pergunta original:
Então, busquei o manipulador de eventos diretamente do elemento DOM e o coloquei no manipulador de eventos jQuery click. Funciona como um encanto.
Agora, para o caso geral. Nos velhos tempos pré-jQuery, você podia anexar todos os eventos a um objeto com duas funções simples, porém poderosas, concedidas a nós mortais por Douglas Crockford :
fonte
Experimente o plug-in do depurador jquery se você estiver usando o chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=pt-BR
fonte
Outra maneira de fazer isso é usar o jQuery para pegar o elemento e, em seguida, passar pelo Javascript real para obter e definir e jogar com os manipuladores de eventos. Por exemplo:
fonte
Combinei algumas das respostas acima e criei esse script maluco, mas funcional, que lista esperançosamente a maioria dos ouvintes de eventos no elemento especificado. Sinta-se livre para otimizá-lo aqui.
fonte
O jQuery não permite que você simplesmente acesse os eventos de um determinado elemento. Você pode acessá-los usando o método interno não documentado
Mas ainda não fornecerá todos os eventos, para ser mais preciso, não mostrará os eventos atribuídos com
Esses eventos são armazenados no documento, para que você possa buscá-los navegando pelas
mas isso é um trabalho árduo, pois há eventos para toda a página da web.
Tom G acima criou a função que filtra o documento apenas para eventos de determinado elemento e mescla a saída dos dois métodos, mas havia uma falha na duplicação de eventos na saída (e efetivamente na lista de eventos internos do elemento jQuery que interfere no seu aplicativo). Corrigi essa falha e você pode encontrar o código abaixo. Basta colar no console do desenvolvedor ou no código do aplicativo e executá-lo quando necessário para obter uma boa lista de todos os eventos para um determinado elemento.
O que é importante notar, o elemento é realmente HTMLElement, não o objeto jQuery.
fonte