Aqui está o meu problema: é possível verificar de alguma forma a existência de um ouvinte de evento anexado dinamicamente? Ou como posso verificar o status da propriedade "onclick" (?) No DOM? Eu pesquisei na Internet como Stack Overflow por uma solução, mas não tive sorte. Aqui está o meu html:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Então, em Javascript, anexo ouvinte de eventos criado dinamicamente ao segundo link:
document.getElementById('link2').addEventListener('click', linkclick, false);
O código funciona bem, mas todas as minhas tentativas de detectar esse listener anexado falham:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle está aqui . Se você clicar em "Adicionar onclick para 2" e depois em "[link 2]", o evento dispara bem, mas o "Link de teste 2" sempre informa falso. Alguém pode ajudar?
Respostas:
Não há como verificar se existem ouvintes de eventos anexados dinamicamente ou não.
A única maneira de ver se um ouvinte de evento está anexado é anexando ouvintes de evento como este:
Você pode então testar se um ouvinte de evento foi anexado
onclick
, retornando!!elem.onclick
(ou algo semelhante).fonte
Eu fiz algo assim:
Criar um atributo especial para um elemento quando o ouvinte é anexado e, em seguida, verificar se ele existe.
fonte
O que eu faria é criar um booleano fora da sua função que começa como FALSE e é definido como TRUE quando você anexa o evento. Isso serviria como uma espécie de sinalizador para você antes de anexar o evento novamente. Aqui está um exemplo da ideia.
fonte
Possível duplicata: verifique se um elemento possui ouvinte de evento. Não jQuery Por favor, encontre minha resposta lá.
Basicamente, aqui está o truque para o navegador Chromium (Chrome):
fonte
tl; dr : Não, você não pode fazer isso de nenhuma forma com suporte nativo.
A única maneira que conheço de fazer isso é criar um objeto de armazenamento personalizado onde você mantém um registro dos ouvintes adicionados. Algo nas seguintes linhas:
Etapa 1: primeiro, você precisará de uma função que possa percorrer o objeto de armazenamento e retornar o registro de um elemento dado o elemento (ou falso).
Etapa 2: Em seguida, você precisará de uma função que possa adicionar um ouvinte de evento, mas também inserir o ouvinte no objeto de armazenamento.
Etapa 3: Com relação ao requisito real de sua pergunta, você precisará da seguinte função para verificar se um elemento foi adicionado como ouvinte de evento para um evento específico.
Etapa 4: finalmente, você precisará de uma função que possa excluir um ouvinte do objeto de armazenamento.
Snippet:
Exibir trecho de código
Embora mais de 5 anos tenham se passado desde que o OP postou a pergunta, acredito que as pessoas que toparem com ela no futuro se beneficiarão com esta resposta, então fique à vontade para fazer sugestões ou melhorias. 😊
fonte
Você sempre pode verificar manualmente se o EventListener existe usando o inspetor do Chrome, por exemplo. Na aba Elemento você tem a tradicional sub-aba "Estilos" e perto dela outra: "Ouvintes de Eventos". O que lhe dará a lista de todos os EventListeners com seus elementos vinculados.
fonte
Parece estranho que esse método não exista. É hora de adicioná-lo finalmente?
Se você quisesse, poderia algo como o seguinte:
fonte
Aqui está um script que usei para verificar a existência de um ouvinte de evento anexado dinamicamente. Usei o jQuery para anexar um manipulador de eventos a um elemento e, em seguida, acionar esse evento (neste caso, o evento 'click'). Dessa forma, posso recuperar e capturar propriedades de eventos que só existirão se o manipulador de eventos estiver conectado.
fonte
Não parece haver uma função de navegador cruzado que procura eventos registrados em um determinado elemento.
No entanto, é possível visualizar as funções de retorno de chamada para elementos em alguns navegadores usando suas ferramentas de desenvolvimento. Isso pode ser útil ao tentar determinar como uma página da web funciona ou para depurar código.
Raposa de fogo
Primeiro, visualize o elemento na guia Inspetor nas ferramentas do desenvolvedor. Isto pode ser feito:
Se algum evento foi registrado para o elemento, você verá um botão contendo a palavra Evento ao lado do elemento. Clicar nele permitirá que você veja os eventos que foram registrados com o elemento. Clicar na seta ao lado de um evento permite visualizar a função de retorno de chamada para ele.
cromada
Primeiro, visualize o elemento na guia Elementos nas ferramentas do desenvolvedor. Isto pode ser feito:
Perto da seção da janela que mostra a árvore que contém os elementos da página da web, deve haver outra seção com uma guia intitulada "Ouvintes de eventos". Selecione-o para ver os eventos que foram registrados no elemento. Para ver o código de um determinado evento, clique no link à direita dele.
No Chrome, os eventos de um elemento também podem ser encontrados usando a função getEventListeners . No entanto, com base em meus testes, a função getEventListeners não lista eventos quando vários elementos são passados para ela. Se quiser encontrar todos os elementos na página que têm ouvintes e visualizar as funções de retorno de chamada para esses ouvintes, você pode usar o seguinte código no console para fazer isso:
Edite esta resposta se você souber de maneiras de fazer isso nos navegadores fornecidos ou em outros navegadores.
fonte
Acabei de descobrir isso tentando ver se meu evento foi anexado ...
se você fizer :
ele retornará "nulo"
mas se você fizer:
então é "VERDADEIRO"
então eu acho que quando você usa "addEventListener" para adicionar manipuladores de eventos, a única maneira de acessá-lo é por meio de "hasOwnProperty". Gostaria de saber por que ou como, mas, depois de pesquisar, não encontrei uma explicação.
fonte
onclick
é separado de.addEventListener
- afeta um atributo, enquanto.addEventListener
nãoSe bem entendi, você só pode verificar se um ouvinte foi verificado, mas não qual ouvinte é o apresentador especificamente.
Portanto, algum código ad hoc iria preencher a lacuna para lidar com seu fluxo de codificação. Um método prático seria criar um
state
usando variáveis. Por exemplo, anexe um verificador de ouvinte da seguinte forma:então, se você definir um ouvinte, basta alterar o valor:
então, dentro do callback de seu eventListener você pode atribuir funcionalidades específicas dentro e da mesma forma, distribuir o acesso a funcionalidades dependendo de algum estado como variável por exemplo:
fonte
Basta remover o evento antes de adicioná-lo:
fonte
Acabei de escrever um script que permite que você faça isso. Ele oferece duas funções globais:
hasEvent(Node elm, String event)
egetEvents(Node elm)
que você pode utilizar. Esteja ciente de que ele modifica oEventTarget
método do protótipoadd/RemoveEventListener
e não funciona para eventos adicionados por meio de marcação HTML ou sintaxe javascript deelm.on_event = ...
Mais informações no GitHub
Demonstração ao vivo
Roteiro:
fonte
Você poderia, em teoria, carregar addEventListener e removeEventListener para adicionar remove um sinalizador ao objeto 'este'. Feio e eu não testei ...
fonte