it-swarm.com.de

MSIE und addEventListener Problem in Javascript?

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

In Chrome/Safari wird beim Kopieren des Inhalts auf der Seite oben die Funktion "beforeecopy" ausgeführt. MSIE soll diese Funktionalität ebenfalls unterstützen, aber aus irgendeinem Grund erhalte ich diesen Fehler:

"Objekt unterstützt diese Eigenschaft oder Methode nicht"

Ich verstehe, dass Internet Explorer nicht mit dem Body-Knoten spielt, aber ich hätte gedacht, dass die Bereitstellung eines Knotens nach ID gut funktionieren würde. Hat jemand eine Idee, was ich falsch mache? Danke im Voraus.

** Bonuspunkte für alle, die mir sagen können, wofür der dritte Parameter "False" gut ist.

78
Matrym

In IE müssen Sie attachEvent anstelle des Standards addEventListener verwenden.

Es ist üblich, zu prüfen, ob die Methode addEventListener verfügbar ist, und sie zu verwenden. Andernfalls verwenden Sie attachEvent:

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

Sie können eine Funktion dafür erstellen:

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');
});

Sie können ein Beispiel für den obigen Code hier ausführen.

Das dritte Argument von addEventListener ist useCapture; Wenn ja, zeigt dies an, dass der Benutzer Ereigniserfassung initiieren möchte.

178
CMS

Falls Sie JQuery 2.x verwenden, fügen Sie bitte Folgendes in das Feld ein

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

Das hat bei mir funktioniert.

28
Aarif

Internet Explorer (IE8 und niedriger) unterstützt addEventListener(...) nicht. Es verfügt über ein eigenes Ereignismodell, das die Methode attachEvent verwendet. Sie könnten einen Code wie folgt verwenden:

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

Ich empfehle jedoch, das Schreiben Ihres eigenen Wrapper für die Ereignisbehandlung zu vermeiden und stattdessen ein JavaScript-Framework zu verwenden (z. B. jQuery , Dojo , MooTools , YUI , Prototype usw.) und vermeiden Sie, das Update hierfür selbst erstellen zu müssen.

Das dritte Argument im W3C-Modell von Ereignissen hat übrigens mit dem Unterschied zwischen blubbernden und erfassenden Ereignissen zu tun. In fast jeder Situation sollten Sie Ereignisse während der Blasenbildung behandeln, nicht wenn sie erfasst werden. Dies ist nützlich, wenn Sie Ereignisdelegierung für Dinge wie "Fokus" -Ereignisse für Textfelder verwenden, die keine Blasen bilden. 

4
Dan Herbert

versuchen Sie es hinzuzufügen 

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

gleich nach dem öffnenden head tag

4
130nk3r5

Ab IE11 müssen Sie addEventListener verwenden. attachEvent ist veraltet und gibt einen Fehler aus.

1
Will Mainwaring

Das Problem ist, dass IE nicht die Standardmethode addEventListener hat. IE verwendet seine eigene attachEvent, die ziemlich genau dasselbe macht.

Eine gute Erklärung für die Unterschiede und auch zum dritten Parameter finden Sie bei quirksmode .

0

Wie PPK auf hier hinweist, können Sie in IE auch verwenden

e.cancelBubble = true;
0
magikMaker

Bei Verwendung von <meta http-equiv="X-UA-Compatible" content="IE=9"> unterstützt IE9 + addEventListener, indem das "ein" im Ereignisnamen wie folgt entfernt wird:

 var btn1 = document.getElementById('btn1');
 btn1.addEventListener('mousedown', function() {
   console.log('mousedown');
 });
0
basiphobe