通常、イベント オブジェクトは次のように記述します。
関数 getEvent(event) {
イベントを返す || ウィンドウ.イベント // IE:ウィンドウ.イベント
}
パラメーターがない場合は、次のように記述することもできます (非 IE: イベント オブジェクトは、対応するイベント処理関数に自動的に渡され、最初のパラメーターになります)。
関数 getEvent() {
戻り値 [0] window.event // IE:window.event
}
この書き方はFirefox以外のブラウザ(テストバージョン:3.0.12、以下同)でも問題なく動作しますが、なぜFirefoxだけ例外なのでしょうか?次のような状況を考えてみましょう。
<button id="btn" onclick="foo()">ボタン</button>
<スクリプト>
関数 foo(){
var e = getEvent();
アラート(e);}
</script>
Firefox では実行結果が未定義ですが、なぜですか?
Firefox での呼び出しは実際には次のようになります。
関数 onclick(event) {
foo();
}
その後、呼び出しが実行されます。
関数 foo(){
var e = getEvent();
アラート(e);
}
Firefox の onclick="foo()" の foo() は、イベント オブジェクトのパラメーターを自動的に渡すことができませんが、デフォルトでシステムによって生成された onclick 関数に渡されることがわかります。この例では、getEvent.caller を渡すことができます。 .caller.arguments[ 0] イベントオブジェクトを取得します。
したがって、getEvent は次のように最適化できます (yui_2.7.0b のevent/event-debug.js の getEvent メソッドを参照)。
関数 getEvent(event) {
var ev = イベント ||
if (!ev) {
var c = this.getEvent.caller;
一方 (c) {
ev = c.arguments[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /Yi Fei のメモ: YUI ソース コードのバグ、ev.constructor は MouseEvent である可能性もあり、必ずしも Event であるとは限りません
壊す;
}
c = c.caller;
}
}
evを返します。
}
もちろん、非常に簡単な解決策があります。それは、パラメーターを onclick="foo()" に手動で渡すことです。
<button id="btn" onclick="foo(event)">ボタン</button>