Pytanie MSIE i addEventListener Problem w JavaScript?


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

W przeglądarce Chrome / Safari powyższa funkcja uruchomi funkcję "beforecopy", gdy kopiowana jest zawartość strony. MSIE ma również obsługiwać tę funkcję, ale z jakiegoś powodu otrzymuję ten błąd:

"Obiekt nie obsługuje tej właściwości lub metody"

Teraz rozumiem, że Internet Explorer nie będzie grał z węzłem body, ale pomyślałbym, że podanie identyfikatora węzła byłoby w porządku. Czy ktoś ma jakieś pomysły na temat tego, co robię źle? Z góry dziękuję.

** Dodatkowe punkty dla każdego, kto może mi powiedzieć, do czego służy trzeci parametr "Fałsz".


76
2017-11-08 04:35


pochodzenie


Oto dobry artykuł wyjaśniający fazę przechwytywania i useCapture bardzo dobrze: coding.smashingmagazine.com/2013/11/12/... - feeela


Odpowiedzi:


W IE musisz użyć attachEvent raczej niż standard addEventListener.

Powszechną praktyką jest sprawdzenie, czy addEventListener metoda jest dostępna i użyj jej, w przeciwnym razie użyj attachEvent:

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

Możesz wykonać funkcję, aby to zrobić:

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

Możesz uruchomić przykład powyższego kodu tutaj.

Trzeci argument addEventListener jest useCapture; jeśli true, wskazuje, że użytkownik chce zainicjować przechwytywanie zdarzeń.


175
2017-11-08 04:40



Doceniam twoją odpowiedź. Po prostu próbowałem tego, co napisałeś, i zadziałało. Tym, co mnie teraz wyrzuca, jest to, że zdarzenie "copy" nie działa, ale zdarzenie "onclick" jest. W szczególności jest to dziwne, ponieważ tryb quirksmode stwierdza, że ​​powinien on działać: quirksmode.org/dom/events/cutcopypaste.htmlJakieś pomysły? - Matrym
Zdrap ten komentarz. Po prostu odizolowałem i spróbowałem tego, co wysłałeś, a zmiana kliknięcia, aby skopiować, działa. Dzięki jeszcze raz. - Matrym
Nie ma za co! - CMS
Właśnie uratowałeś moje zdrowie psychiczne, CMS. Dziękuję dziękuję! - CodeMouse92
dlaczego pokazuje własna dokumentacja Microsoftu addEventListener następnie? msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx - wmarbut


Jeśli używasz JQuery 2.x, dodaj następujące elementy w

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

To działało dla mnie.


28
2017-08-19 15:05



dla tych, którzy uruchamiają wersje IE <= 8, nie rozwiąże to problemu. - ninjaneer


Internet Explorer (IE8 i niższe) nie obsługuje addEventListener(...). Ma własny model zdarzeń z wykorzystaniem attachEvent metoda. Możesz użyć kodu takiego jak ten:

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

Chociaż zalecam unikanie pisania własnego opakowania do obsługi zdarzeń, a zamiast tego użyj struktury JavaScript (np jQuery, Dojo, MooTools, YUI, Prototyp, itp.) i uniknięcia konieczności samodzielnego tworzenia poprawek.

Nawiasem mówiąc, trzeci argument w modelu zdarzeń W3C ma związek z różnica między bulgotaniem i przechwytywaniem zdarzeń. W niemal każdej sytuacji będziesz chciał obsługiwać zdarzenia podczas bańki, a nie kiedy zostaną przechwycone. Jest to przydatne podczas używania delegowanie wydarzeń na takie rzeczy jak zdarzenia "focus" dla pól tekstowych, które nie są bańkami.


4
2017-11-08 04:45





spróbuj dodać

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

zaraz po tagu otwierającej głowy


3
2017-08-19 07:55



dla tych, którzy uruchamiają wersje IE <= 8, nie rozwiąże to problemu. - ninjaneer


Począwszy od IE11, musisz użyć addEventListener. attachEvent jest przestarzałe i generuje błąd.


1
2017-11-19 09:32



Czy możesz dalej z niego korzystać, jeśli wstawisz metatag zgodny z X-ua? - Vincent


Jak wskazuje PPK tutaj, w IE możesz również użyć

e.cancelBubble = true;

0
2017-10-10 13:47





Za pomocą <meta http-equiv="X-UA-Compatible" content="IE=9">, IE9 + obsługuje addEventListener poprzez usunięcie "on" w nazwie zdarzenia, na przykład:

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

0
2017-11-16 21:44





Problem polega na tym, że IE nie ma standardu addEventListener metoda. IE używa własnych attachEvent co jest prawie takie samo.

Można znaleźć dobre wyjaśnienie różnic, a także trzeci parametr w trybie quirksmode.


0
2017-11-08 04:41