2013-04-12 22 views
7

新しいDOMイベントモデルについてLynda.comのチュートリアルに従っています。addEventListenerがChromeで動作しない

これは私が作業しているコードです。

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

は、私は、このリンク

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

それはIE、Firefoxの、OPRAに完全に正常に動作しなくChromeの上でクリックイベントに追加しています。私は周りを見回しましたが、まだ特定のものを見つけることができませんでした。いくつかの同様の質問が、私の質問に答えることはありません。

私は

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

クロームコンソールから任意のsugestionsまたは回答へのリンクを次のエラーを取得します。

ありがとうございます。

+1

は、あなたが使用したいもの以外のオブジェクトの存在のためのテストの危険性を示しています。 'if(typeof oNode.attachEvent!=" undefined ")'が良いでしょう。最初にそれをテストすることによって、標準ベースの関数 'addEventListener'を好む方が良いでしょう。 –

答えて

7

なぜあなたがテストしている:

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

を... attachEvent()を使用するかどうかを決定するためには? Chromeはwindow.eventを定義しているため、コードでは定義されていないattachEvent()を使用しようとしています。

ではなく、直接メソッドをテストしてみてください。

はっきり悪いチュートリアルだと
if (oNode.attachEvent) 
    oNode.attachEvent("on" + sEvt, fFunc); 
else 
    oNode.addEventListener(sEvt, fFunc, bCapture); 
+0

私はちょうど新しいDOMイベントモデルを調べ始めました。これはコースのインストラクターがテストしているものですが、2009年です。しかし、あなたの答えは完璧です。私にとってもそれほど意味がありませんでした。なぜそのテストはChromeでは動作しませんが、他のすべてのブラウザで動作します。しかし、あなたの答えはうまくいきます。なぜか、それが単にそれをスキップしてelse文に進むのはなぜなのでしょうか? –

+2

あなたが示したコードは、2009年にも意味をなさないものでした。私の答えで言ったように、Chromeは 'window.event'を定義しているので、' if'条件はChromeでtrueになり、Chromeで定義されていない '.attachEvent()'を使用しようとします(テキストあなたが言及したエラーの)。元のコードは 'window.event'と' .attachEvent() 'の両方を定義し、' window.event'を定義していないのでFFなどで動作するのでIEで動作します。 – nnnnnn

+0

ありがとう、素晴らしい説明。最初のコメントでそれを逃した。 –

関連する問題