2012-03-21 21 views
27

(追加されたイベントリスナーで関数を呼び出す)私はこの部分でのトラブルがあります。FFはなぜwindow.eventが定義されていないと言っているのですか?

var ex = { 
    exampl: function(){ 
    var ref=window.event.target||window.event.srcElement; // here 
    alert(ref.innerHTML); // (example) 
    } 
} 

をこの関数は、このよう呼び出されます。

document.body.childNodes[0].addEventListener('mouseover',ex.exampl,true); 

のみFirefoxはwindow.eventが定義されていないと述べています。..

私は何をすべきかわからない、それを動作させる。 WebkitブラウザやOperaでうまく動作します(MSIEでは確認できませんし、気にしません)。

どうしてですか?

+0

正しい質問は、他のブラウザではなぜ機能するのですか? –

答えて

20

渡されたパラメータ(この場合はeという名前)を使用してイベントを取得してみてください。私はこれをテストし、window.eventeはクロムでサポートされています。

try checking for both, whichever exists

var ex = { 
    exampl: function(e){ 

    console.log(window.event); 
    console.log(e); 

    //check if we have "e" or "window.event" and use them as "evt" 
    var evt = e || window.event  

    } 
} 
+0

"addEventListener"を変更する必要がありますか? –

+0

いいえ、同じままです。 – Joseph

+0

ありがとうございました!私はFFで動作するので、とても役に立ちました: 'exampl:function(e){if(window.event &&!e)e = window.event; var ref = e.target || e.srcElement;} '。 –

14

window.eventは、Firefoxには存在しませんので。ブラウザにはさまざまなイベントモデルがあり、その違いを扱う必要があります。また、jQueryのようなライブラリを使用して、ブラウザ間の違いをすべて処理する必要もありません。 DOMへようこそ。

3

クロムにはネイティブもありません。すべてのイベントトリガーに独自のイベントオブジェクトを渡すのではなく、IEはプロパティをwindow.eventにドロップし、それを渡しました。一度に1つのイベントしか扱っていないので、これはうまくいきました。すべてのブラウザに必要なものは、イベントオブジェクトの実際のコンストラクタであるwindow.Eventです。 IE8以降のどこでも 'window.event'が表示されている場合は、空白のタブでコンソールを開き、そこにログを記録するか、警告してみてください。あなたが見ているページに手作業で追加している可能性があります。

あなたはイベントハンドラのcrossbrowser正規化コードを見れば、あなたが頻繁に表示されます:

イベントはIEの古いバージョンを扱う正規化コードがあります
if(!e){ e = window.event; } 

。現代のブラウザでは、eは引数を渡される独自のオブジェクトでなければならず、ウィンドウのプロパティへの参照ではありません。

13

window.eventは、バグです。 MDNを引用

window.eventは、DOMイベントハンドラが呼び出されている間のみ使用可能です独自のMicrosoft Internet Explorerのプロパティです。その値は現在処理中のEventオブジェクトです。

そして、最も重要:

ない任意の仕様の一部。

window.eventはそうどのブラウザがそれをサポートすることを期待していない、非標準です。

element.addEventListener()のコールバック関数の最初のパラメータはEventオブジェクトです。 window.eventの代わりに使用してください。

+1

これは正しい方向に私を指摘しました!クリックイベントとセカンダリ引数の両方を取得する必要がありました。あなたが言うように、関数の最初の引数はイベントでなければならず、それを関数への呼び出しにも含める必要があります。 onclick = 'myClickEvent(event、mySecondAttr);'のように – SteinIP

関連する問題