2013-04-12 13 views
7

Podążam za tutorialem na stronie Lynda.com o nowym modelu zdarzenia DOM.addEventListener nie działa w Chrome

To jest kod, nad którym pracuję.

function addEventHandler(oNode, sEvt, fFunc, bCapture){ 

if (typeof (window.event) != "undefined") 
    oNode.attachEvent("on" + sEvt, fFunc); 
else 
    oNode.addEventListener(sEvt, fFunc, bCapture); 
} 

function onLinkClicked(e){ 
alert('You clicked the link'); 
} 

function setUpClickHandler(){ 
addEventHandler(document.getElementById("clickLink"), "click", onLinkClicked, false); 
} 


addEventHandler(window, "load", setUpClickHandler, false); 

dodaję go do zdarzenia kliknij na ten link

<a href="#" title="click me" id="clickLink">Click Me!</a> 

To działa perfekcyjnie w IE, Firefox, OPRA ale nie w Chrome. Rozejrzałem się, ale nie udało mi się znaleźć niczego konkretnego. Niektóre podobne pytania, ale nie odpowiada na moje pytanie.

pojawia się następujący błąd w konsoli Chrome

Uncaught TypeError: Object [object HTMLAnchorElement] has no method 'attachEvent' 

jakieś sugestie lub link do odpowiedzi.

z góry dzięki.

+1

To zły poradnik i wyraźnie pokazuje niebezpieczeństwa testów na istnienie obiektu innego niż ten, którego chcesz użyć. 'if (typeof oNode.attachEvent! =" undefined ")' byłoby lepsze. Jeszcze lepiej byłoby preferować opartą na standardach funkcję 'addEventListener' poprzez testowanie tego pierwszego. –

Odpowiedz

7

Czemu testowanie:

if (typeof (window.event) != "undefined") 

... w celu podjęcia decyzji, czy użyć attachEvent()? Chrome definiuje window.event, więc twój kod próbuje użyć attachEvent(), który nie jest zdefiniowany.

Spróbuj zamiast testowania dla metody bezpośrednio:

if (oNode.attachEvent) 
    oNode.attachEvent("on" + sEvt, fFunc); 
else 
    oNode.addEventListener(sEvt, fFunc, bCapture); 
+0

dziękuję, właśnie zacząłem zaglądać do nowego modelu zdarzeń DOM, i to jest to, czego testuje instruktor, ale jest od roku 2009. Ale twoja odpowiedź jest doskonała, nie miało to dla mnie większego sensu. Dlaczego ten test nie działa w Chrome, ale działa we wszystkich innych przeglądarkach? Ale twoja odpowiedź działa, dziękuję, jestem ciekawy, dlaczego nie pomija go i przechodzi do instrukcji else. –

+2

Kod, który pokazałeś, również nie miał sensu w 2009 roku. Jak już powiedziałem w mojej odpowiedzi, Chrome definiuje 'window.event', więc warunek' if' będzie prawdziwy w Chrome, co spowoduje próbę użycia '.attachEvent()', który nie jest zdefiniowany w Chrome (jak wskazuje na to tekst błędu, o którym wspomniałeś). Oryginalny kod działa w IE, ponieważ definiuje zarówno 'window.event', jak i' .attachEvent() 'i działa w FF itp., Ponieważ nie definiuje' window.event'. – nnnnnn

+0

Dzięki, wielkie wyjaśnienie. Przegapiłem to w pierwszym komentarzu. –