2017-12-13 11 views
0
私はwindow.eventのFirefoxの欠如によって不意を突かれてい

...つまりFirefoxのwindow.eventの不足のための回避策?

<script> 
function clicked() 
{ 
console.log(event); 
} 
</script> 

<div onclick = "clicked()">Whatever</div> 

は、ほとんどすべての近代的なブラウザでは使えますが、まだ「イベント」は、我々が明示的に持っているのFirefox、で定義されません書き込み

Firefoxでイベントオブジェクトにアクセスするには、関数パラメータとして明示的に指定する必要はありませんが、回避策はありますか?

+3

あなたもそれをしたいと思うのはなぜ? 'window.event'は完全に非標準です。 –

+2

??すでに「回避策」があり、イベントオブジェクトをハンドラに渡しています。グローバルイベントオブジェクトは標準ではありません。最初は使用しないでください。 – Teemu

+0

時には、企業は、ハックによってほとんど機能しないコードを継承し、完全な書き換えは並行して実行されます。 – resle

答えて

1

すべてのイベントリスナーがEventTarget.addEventListener()メソッドによって最終的に登録されるという仮定に基づいて、ここでは醜いハックがあります。以下の "解決策"は、実際のリスナーに委任する前に、イベントをwindow.eventに割り当てるメソッドで、すべてのイベントリスナーをラップするようにEventTargetのプロトタイプ(yuck!)を変更します。

const addEventListener = EventTarget.prototype.addEventListener; 
 

 
EventTarget.prototype.addEventListener = function(name, handler) { 
 
    addEventListener.call(this, name, function(event) { 
 
    window.event = event; 
 
    
 
    handler(event); 
 
    }) 
 
}; 
 

 
function clicked() { 
 
    // just demonstrating that window.event is set 
 
    console.log(window.event.target.innerHTML); 
 
} 
 

 
document.getElementById('one').addEventListener('click', clicked); 
 
document.getElementById('two').addEventListener('click', clicked);
<button id="one">Test 1</button> 
 
<button id="two">Test 2</button>

上記だけの可能なアプローチを示しており、大部分は未検証です。あなたのマイレージは異なる場合があります。


更新

たように、これはon... HTML属性またはElement.on...プロパティを使用して割り当てを介して結合し、イベントハンドラのために動作しません、コメントで指摘しました。

代替的な(そして確かに安全な)アプローチは、ドキュメント要素に対してイベントキャプチャを使用し、そこでwindow.eventへの割り当てを実行することです。

document.documentElement.addEventListener('click', function(event) { 
 
    window.event = event; 
 
}, true); 
 

 
function clicked() { 
 
    // just demonstrating that window.event is set 
 
    console.log(window.event.target.innerHTML); 
 
} 
 

 
document.getElementById('one').addEventListener('click', clicked); 
 
document.getElementById('two').onclick = clicked;
<button id="one">Test 1</button> 
 
<button id="two">Test 2</button> 
 
<button id="three" onclick="clicked()">Test 3</button>

+0

不気味で恐ろしい仕事。この忌み嫌われたものをしばらく生き続けさせるのに十分なほど良い。 – resle

+0

いいえ、HTMLEventAttributeは 'EventTarget#addEventListener'で終了しません。これは、このメソッドで登録されたイベントに対してのみ*機能します。 – Kaiido

+0

@Kaiidoご明記ください。 HTMLEventAttributeはどういう意味ですか?あなたは例を挙げることができますか? –

関連する問題