ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptがイベントの注目ポイントを取得する object_javascriptスキル

JavaScriptがイベントの注目ポイントを取得する object_javascriptスキル

WBOY
WBOYオリジナル
2016-05-16 18:49:101293ブラウズ

通常、イベント オブジェクトは次のように記述します:

コードをコピーします コードは次のとおりです:

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 メソッドを参照):



コードをコピー コードは次のとおりです。 function getEvent(event) {
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()" に渡すという非常に簡単な解決策もあります。 :



コードをコピー
コードは次のとおりです:
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。