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.

15
demandé sur Community 2011-08-27 12:25:23

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/calladdEventListener

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]);
29
répondu Matthew Caruana Galizia 2011-08-27 10:41:54