Voici mon problème: est-il possible d'une manière ou d'une autre de vérifier l'existence d'un écouteur d'événements attaché dynamiquement? Ou comment puis-je vérifier l'état de la propriété "onclick" (?) Dans DOM? J'ai cherché une solution sur Internet, comme Stack Overflow, mais pas de chance. Voici mon html:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Puis en Javascript, j'attache un écouteur d'événement créé dynamiquement au 2ème lien:
document.getElementById('link2').addEventListener('click', linkclick, false);
Le code fonctionne bien, mais toutes mes tentatives pour détecter cet écouteur attaché échouent:
// 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 se trouve ici . Si vous cliquez sur "Ajouter un clic pour 2" puis sur "[lien 2]", l'événement se déclenche bien, mais le "Test lien 2" rapporte toujours faux. Quelqu'un peut-il aider?
Réponses:
Il n'existe aucun moyen de vérifier si des écouteurs d'événements attachés dynamiquement existent ou non.
La seule façon de voir si un écouteur d'événement est attaché est de joindre des écouteurs d'événement comme ceci:
Vous pouvez ensuite tester si un écouteur d'événement a été attaché
onclick
en retournant!!elem.onclick
(ou quelque chose de similaire).la source
J'ai fait quelque chose comme ça:
Création d'un attribut spécial pour un élément lorsque l'auditeur est attaché, puis vérification de son existence.
la source
Ce que je ferais, c'est créer un booléen en dehors de votre fonction qui commence par FALSE et est défini sur TRUE lorsque vous attachez l'événement. Cela vous servirait d'une sorte de drapeau avant de rattacher à nouveau l'événement. Voici un exemple de l'idée.
la source
Double possible: vérifiez si un élément possède un écouteur d'événements. Pas de jQuery Veuillez trouver ma réponse ici.
En gros, voici l'astuce pour le navigateur Chromium (Chrome):
la source
tl; dr : Non, vous ne pouvez pas faire cela de manière native.
Le seul moyen que je connaisse pour y parvenir serait de créer un objet de stockage personnalisé dans lequel vous conservez un enregistrement des écouteurs ajoutés. Quelque chose dans le sens suivant:
Étape 1: Tout d'abord, vous aurez besoin d'une fonction qui peut traverser l'objet de stockage et retourner l'enregistrement d'un élément donné l'élément (ou false).
Étape 2: Ensuite, vous aurez besoin d'une fonction qui peut ajouter un écouteur d'événements, mais également insérer l'écouteur dans l'objet de stockage.
Étape 3: En ce qui concerne l'exigence réelle de votre question, vous aurez besoin de la fonction suivante pour vérifier si un élément a été ajouté à un écouteur d'événement pour un événement spécifié.
Étape 4: Enfin, vous aurez besoin d'une fonction permettant de supprimer un écouteur de l'objet de stockage.
Fragment:
Afficher l'extrait de code
Bien que plus de 5 ans se soient écoulés depuis que le PO a publié la question, je crois que les gens qui tomberont dessus à l'avenir bénéficieront de cette réponse, alors n'hésitez pas à y faire des suggestions ou des améliorations. 😊
la source
Vous pouvez toujours vérifier manuellement si votre EventListener existe en utilisant l'inspecteur Chrome par exemple. Dans l'onglet Elément, vous avez le sous-onglet traditionnel "Styles" et à proximité un autre: "Écouteurs d'événements". Ce qui vous donnera la liste de tous les EventListeners avec leurs éléments liés.
la source
Il semble étrange que cette méthode n'existe pas. Est-il temps de l'ajouter enfin?
Si vous le vouliez, vous pourriez quelque chose comme ce qui suit:
la source
Voici un script que j'ai utilisé pour vérifier l'existence d'un écouteur d'événements attaché dynamiquement. J'ai utilisé jQuery pour attacher un gestionnaire d'événements à un élément, puis déclencher cet événement (dans ce cas, l'événement 'click'). De cette façon, je peux récupérer et capturer des propriétés d'événement qui n'existeront que si le gestionnaire d'événements est attaché.
la source
Il ne semble pas y avoir de fonction de navigateur croisé qui recherche les événements enregistrés sous un élément donné.
Cependant, il est possible de visualiser les fonctions de rappel des éléments dans certains navigateurs en utilisant leurs outils de développement. Cela peut être utile lorsque vous essayez de déterminer le fonctionnement d'une page Web ou pour le débogage du code.
Firefox
Tout d'abord, affichez l'élément dans l' onglet Inspecteur dans les outils de développement. Ceci peut être fait:
Si des événements ont été enregistrés dans l'élément, vous verrez un bouton contenant le mot Événement côté de l'élément. En cliquant dessus, vous pourrez voir les événements qui ont été enregistrés avec l'élément. Cliquez sur la flèche à côté d'un événement pour afficher la fonction de rappel correspondant.
Chrome
Tout d'abord, affichez l'élément dans l' onglet Éléments des outils de développement. Ceci peut être fait:
Près de la section de la fenêtre qui montre l'arborescence contenant les éléments de la page Web, il devrait y avoir une autre section avec un onglet intitulé "Écouteurs d'événements". Sélectionnez-le pour voir les événements enregistrés dans l'élément. Pour voir le code d'un événement donné, cliquez sur le lien à droite de celui-ci.
Dans Chrome, les événements d'un élément peuvent également être trouvés à l'aide de la fonction getEventListeners . Cependant, d'après mes tests, la fonction getEventListeners ne répertorie pas les événements lorsque plusieurs éléments lui sont passés. Si vous souhaitez rechercher tous les éléments de la page qui ont des écouteurs et afficher les fonctions de rappel de ces écouteurs, vous pouvez utiliser le code suivant dans la console pour ce faire:
Veuillez modifier cette réponse si vous connaissez des moyens de le faire dans les navigateurs donnés ou dans d'autres navigateurs.
la source
Je viens de le découvrir en essayant de voir si mon événement était attaché ...
si tu fais :
il retournera "null"
mais si vous faites:
alors c'est "VRAI"
donc je pense que lorsque vous utilisez "addEventListener" pour ajouter des gestionnaires d'événements, le seul moyen d'y accéder est via "hasOwnProperty". J'aurais aimé savoir pourquoi ou comment mais hélas, après des recherches, je n'ai pas trouvé d'explication.
la source
onclick
est distinct de.addEventListener
- il affecte un attribut alors que.addEventListener
ne le fait pasSi je comprends bien, vous pouvez uniquement vérifier si un auditeur a été vérifié, mais pas quel auditeur est spécifiquement présentateur.
Ainsi, un code ad hoc comblerait le vide pour gérer votre flux de codage. Une méthode pratique serait de créer une
state
utilisation de variables. Par exemple, attachez le vérificateur d'un auditeur comme suit:puis si vous définissez un écouteur, changez simplement la valeur:
puis dans le callback de votre eventListener, vous pouvez attribuer des fonctionnalités spécifiques à l'intérieur et de la même manière, distribuer l'accès aux fonctionnalités en fonction de certains états comme variable par exemple:
la source
Supprimez simplement l'événement avant de l'ajouter:
la source
Je viens d'écrire un script qui vous permet d'y parvenir. Il vous donne deux fonctions globales:
hasEvent(Node elm, String event)
etgetEvents(Node elm)
que vous pouvez utiliser. Sachez que cela modifie laEventTarget
méthode prototypeadd/RemoveEventListener
et ne fonctionne pas pour les événements ajoutés via le balisage HTML ou la syntaxe javascript deelm.on_event = ...
Plus d'informations sur GitHub
Démo en direct
Scénario:
la source
Vous pouvez en théorie superposer addEventListener et removeEventListener pour ajouter remove un indicateur à l'objet «this». Moche et je n'ai pas testé ...
la source