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