Uncaught TypeError: invocation illégale sur addEventListener
je Uncaught TypeError: Illegal invocation
pour les deux versions de cette tentative de mettre un EventListener: (je reçois le message d'erreur lors de l'auditeur doit être ajouté, pas quand je clique sur la cible)
ronan.addEventListener("click", alert, false);
addEventListener.apply(ronan, ["click", alert, false]);
ronan
est un div
élément qui est retourné avec succès par la console donc je ne pense pas que ce soit le problème. Des idées pourquoi j'ai cette erreur? J'ai lu fil et je ne pouvais pas le comprendre.
1 réponses
vous devez envelopper alert
dans une fonction. Cela va fonctionner:
ronan.addEventListener("click", function() { alert('Hi'); }, false);
Voici un tripoter pour preuve. En utilisant alert
seul ne fonctionne pas parce que lorsqu'un écouteur est exécuté à la valeur de this
à l'intérieur de cette fonction est définie à l'objet sur lequel elle écoute. Par exemple, si vous définissez un écouteur sur ronan
, au sein de cet écouteur this === ronan
. Cela pose un problème pour alert
parce que cette fonction attend this
pour être égal à window
. Vous pouvez travailler autour de cela (sans jeu de mots) en enveloppant la fonction dans une autre fonction ou en la liant à ce qu'elle attend this
soit:
document.body.addEventListener('click', alert.bind(window), false);
N'oubliez pas que dans IE < 9 Vous devez utiliser attachEvent
plutôt que addEventListener
.
une note sur l'utilisation de apply
/call
addEventListener
Votre deuxième tentative ne fonctionne pas parce que vous essayez d'appliquer vos arguments window.addEventListener
plutôt pour HTMLElement.prototype.addEventListener
, ce qui est différent fonction:
// This won't work
addEventListener.apply(ronan, ["click", alert.bind(window), false]);
// This will work
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]);