document.getElementById('container').addEventListener('copy',beforecopy,false );
W przeglądarce Chrome / Safari powyższe spowoduje uruchomienie funkcji „beforecopy” podczas kopiowania zawartości 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”
Rozumiem, że Internet Explorer nie będzie grał z węzłem treści, ale pomyślałbym, że podanie węzła według identyfikatora będzie działać dobrze. 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”.
useCapture
bardzo dobrze: coding.smashingmagazine.com/2013/11/12/...Odpowiedzi:
W IE musisz używać
attachEvent
zamiast standarduaddEventListener
.Powszechną praktyką jest sprawdzenie, czy
addEventListener
metoda jest dostępna i zastosowanie jej, w przeciwnym razie użyjattachEvent
:if (el.addEventListener){ el.addEventListener('click', modifyText, false); } else if (el.attachEvent){ el.attachEvent('onclick', modifyText); }
Możesz utworzyć 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żna uruchomić przykład powyższy kod tutaj .
Trzeci argument
addEventListener
jestuseCapture
; jeśli prawda, wskazuje, że użytkownik chce zainicjować przechwytywanie zdarzeń .źródło
addEventListener
? msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspxJeś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 zadziałało dla mnie.
źródło
spróbuj dodać
<meta http-equiv="X-UA-Compatible" content="IE=edge">
zaraz po otwierającym tagu head
źródło
Internet Explorer (IE8 i starsze) nie obsługuje
addEventListener(...)
. Posiada własny model zdarzeń wykorzystujący tęattachEvent
metodę. Możesz użyć takiego kodu: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 obsługi zdarzeń i zamiast tego używać frameworka JavaScript (takiego jak jQuery , Dojo , MooTools , YUI , Prototype itp.) I unikać konieczności samodzielnego tworzenia poprawki.
Nawiasem mówiąc, trzeci argument w modelu zdarzeń W3C dotyczy różnicy między bulgotaniem a przechwytywaniem zdarzeń . W prawie każdej sytuacji będziesz chciał obsługiwać wydarzenia w momencie ich bąblowania, a nie w momencie ich przechwycenia. Jest to przydatne w przypadku delegowania zdarzeń do takich elementów, jak zdarzenia „fokus” dla pól tekstowych, które nie są bąbelkami.
źródło
Od IE11 musisz używać
addEventListener
.attachEvent
jest przestarzały i zgłasza błąd.źródło
Jak wskazuje tutaj PPK , w IE można również używać
e.cancelBubble = true;
źródło
Używanie
<meta http-equiv="X-UA-Compatible" content="IE=9">
IE9 + obsługujeaddEventListener
poprzez usunięcie „on” w nazwie wydarzenia, na przykład:var btn1 = document.getElementById('btn1'); btn1.addEventListener('mousedown', function() { console.log('mousedown'); });
źródło
Problem w tym, że IE nie ma standardowej
addEventListener
metody. IE używa własnego,attachEvent
który robi prawie to samo.Dobre wyjaśnienie różnic, a także trzeciego parametru, można znaleźć w quirksmode .
źródło