-1

私たちのアプリケーションでは、変数スコープを介してすべての ajax 呼び出しの e (イベント) をキャッチしようとしています。例えば:

function whatever (e) {
        stuff();
}

function stuff() {
        thingy();
} 

function thingy() {
        // I have access to e
}

パラメータとして e スルーを渡さない場合、子関数は親のイベントにアクセスできる必要があります。chrome と IE では動作しますが、firefox では動作しません。e は常に firefox では定義されていません。アプリで何百もの ajax 呼び出しを実行し、これが機能するためのパラメーターとしてすべての場所に e を渡す必要はありません。他に方法はありますか?

4

3 に答える 3

1

いいえ。引数は、内部で直接定義されたコード、または参照を渡す関数eでのみ使用できます。渡さない限り whatever()、内部から呼び出された関数では使用できません。whatever()

これは、すべてのブラウザーで失敗する質問のコードの正確な実装です: http://jsfiddle.net/jfriend00/ReNKU/

解決策については、ローカル関数をe使用して、次のように他の 2 つの関数で使用できるようにすることができます。これらの関数は のスコープ内で定義されているためですwhatever()

function whatever (e) {
    function stuff() {
        // e is available here
        thingy();
    } 

    function thingy() {
        // e is available here
    }

    // e is available here
    stuff();
}

または、元の関数のそれぞれに引数として渡すこともできます。

function whatever (e) {
        stuff(e);
}

function stuff(e) {
        thingy(e);
} 

function thingy(e) {
}

関数引数の利用可能性に関するこの質問は、Firefox とは関係ありません。これは、どこでも同じ JavaScript 実装の選択であるためです。

あなたの特定のコードがたまたま他のブラウザで動作している場合、どうやらそれがピックアップしているグローバル変数eまたは他の親コンテキストにグローバル変数があり、それはたまたま正しい値を持っていますが、それはそうではありませんあなたの宣言から来ています。いずれにせよ、そのような暗黙の動作に依存するのは良くありません。eewhatever(e)

引数 e を他の 2 つの関数で使用できるようにする場合は、次の 2 つの適切な選択肢があります。

  1. それを引数として渡します。
  2. これらの関数を のスコープ内で定義してwhatever(e)、引数を直接見ることができるようにします。

あなたが本当にしようとしているのが、イベント ハンドラーで発生したイベントへのアクセスを取得することである場合は、次のことだけを知っておく必要があります。

を使用している場合.addEventListener()、イベント データ構造が最初の引数としてイベント ハンドラに渡されます。これは.addEventListener()、IE9 を含む、サポートするすべてのブラウザーに当てはまります。古いバージョンの IEを使用.attachEvent()している場合、イベント データ構造はグローバル変数window.eventにあり、そこからアクセスできます。イベント ハンドラーが開始されたら、このデータ構造を呼び出した他の関数で使用できるようにしたい場合は、それを引数としてそれらに渡す必要があります。その後、それらの動作は完全にブラウザーセーフになります。

これは、イベントの違いも処理する簡単なクロス ブラウザー イベント登録関数です。

// add event cross browser
function addEvent(elem, event, fn) {
    if (elem.addEventListener) {
        elem.addEventListener(event, fn, false);
    } else {
        elem.attachEvent("on" + event, function() {
            // set the this pointer same as addEventListener when fn is called
            // and get the event data structure from the global variable and
            // pass it to the event handler
            return(fn.call(elem, window.event));   
        });
    }
}
于 2012-08-31T17:38:01.140 に答える
0

jfriend00は、Firefoxではないことについて100%正しくありません。それは実際にはFirefoxと関係があります。イベントは、chromeおよびIEで(イベントの名前を知っている限り)名前でグローバルにアクセスできます。ただし、firefoxはie/chromeとは異なる方法でイベントを処理します。関数のチェーンを介してイベントをパラメーターとして渡す以外に解決策があるかどうかはわかりません。

于 2012-08-31T19:17:03.687 に答える
0

jsfiddle.net/LU4yT/2 この jsfiddle リンクは、使用しているブラウザによって結果が明らかに異なるため、問題はブラウザ固有のものであると言えます... ただし、グローバルイベントにアクセスできる間は jfriend00 に同意する必要があるかもしれませんイベントをパラメーターとして渡す方がよいでしょう (ただし、メモリの消費量は多くなります)。

于 2012-08-31T19:21:21.717 に答える