85 votes

MSIE et le problème de addEventListener en Javascript ?

document.getElementById('container').addEventListener('copy',beforecopy,false );

Dans Chrome / Safari, les éléments ci-dessus exécuteront la fonction "beforecopy" lorsque le contenu de la page sera copié. MSIE est censé prendre en charge cette fonction également, mais pour une raison quelconque, j'obtiens cette erreur :

"L'objet ne supporte pas cette propriété ou méthode"

Je crois savoir qu'Internet Explorer ne joue pas avec le nœud body, mais j'aurais pensé que fournir un nœud par ID fonctionnerait bien. Quelqu'un a-t-il une idée de ce que je fais de mal ? Merci d'avance.

** Points bonus pour quiconque pourra me dire à quoi sert le 3ème paramètre "False".

186voto

CMS Points 315406

Dans IE, vous devez utiliser attachEvent plutôt que la norme addEventListener .

Une pratique courante consiste à vérifier si le addEventListener est disponible et l'utiliser, sinon utiliser la méthode attachEvent :

if (el.addEventListener){
  el.addEventListener('click', modifyText, false); 
} else if (el.attachEvent){
  el.attachEvent('onclick', modifyText);
}

Vous pouvez créer une fonction pour le faire :

function bindEvent(el, eventName, eventHandler) {
  if (el.addEventListener){
    el.addEventListener(eventName, eventHandler, false); 
  } else if (el.attachEvent){
    el.attachEvent('on'+eventName, eventHandler);
  }
}
// ...
bindEvent(document.getElementById('myElement'), 'click', function () {
  alert('element clicked');
});

Vous pouvez exécuter un exemple du code ci-dessus ici .

Le troisième argument de addEventListener est useCapture ; si elle est vraie, elle indique que l'utilisateur souhaite initier capture d'événements .

33voto

Aarif Points 8

Si vous utilisez JQuery 2.x, veuillez ajouter les éléments suivants dans le fichier

<html>
   <head>
      <meta http-equiv="X-UA-Compatible" content="IE=edge;" />
   </head>
   <body>
    ...
   </body>
</html>

Cela a marché pour moi.

5voto

Dan Herbert Points 38336

Internet Explorer ne prend pas en charge addEventListener(...) sous quelque forme que ce soit. Il dispose de son propre modèle d'événement, totalement différent, qui utilise l'option attachEvent méthode. Vous pourriez utiliser un code comme celui-ci :

var element = document.getElementById('container');
if (document.addEventListener){
    element .addEventListener('copy', beforeCopy, false); 
} else if (el.attachEvent){
    element .attachEvent('oncopy', beforeCopy);
}

Bien que je vous recommande d'éviter complètement cette situation et d'utiliser simplement un framework JavaScript (tel que jQuery , Dojo , MooTools , YUI ou Prototype ) et éviter d'avoir à se soucier complètement de ces problèmes.

D'ailleurs, le troisième argument dans le modèle d'événements du W3C concerne l'élément différence entre le bouillonnement et la capture d'événements . Dans presque toutes les situations, vous voudrez traiter les événements au fur et à mesure qu'ils se produisent, et non lorsqu'ils sont capturés.

La seule fois où j'ai vu qu'il était utile de gérer des événements pendant la phase de "capture" est lors de l'utilisation de délégation d'événements sur des choses comme les événements de focus pour les boîtes de texte, qui ne font pas de bulles.

5voto

user1285325 Points 41

Essayez d'ajouter

<meta http-equiv="X-UA-Compatible" content="IE=edge"> 

juste après la balise d'ouverture head

0voto

Jani Hartikainen Points 23183

Le problème est qu'IE ne dispose pas de la méthode standard addEventListener. IE utilise sa propre méthode attachEvent qui fait à peu près la même chose.

Vous trouverez une bonne explication des différences, ainsi que du 3ème paramètre. à quirksmode

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X