2

質問

元のイベント パラメータがなくても、関数がユーザー イベントまたは非同期イベント (コールバックなど) によって起動されたかどうかを知ることは可能ですか?

バックグラウンド

元のイベント トリガーが誰であるかがわからない、より深い関数呼び出しでイベント ソースを特定しようとしています。

ポップアップまたはリダイレクト ログイン システムを呼び出すには、そのことを知っておく必要があります。しかし、この関数は多くの場所から呼び出されるため、すべての呼び出し元にイベント パラメーターを渡すことはできません。

重要:最終関数にパラメーターを渡すことができませんb('timer')許可されていません。

例えば:

  <a onclick="b()" >call</a>
   <script>
 
   function a(){
      b();
   }

   function b(){
      final();
   }

   function final(){
      //Is there something like this caller.event.source ?
      console.log(this.caller.event.source)
   }
   
   setTimeout(a,1000);

source == 'timer'その例では、または'onclick'、またはその他の情報を取得して、どちらがイベントの発生元であるかを判断しようとしています。

アップデート

basilikun アプローチに基づいて、このソリューションを実装しました。

function final(){
    var callerFunction = arguments.callee.caller,
    evtArg = callerFunction.arguments[0];
    while(callerFunction.caller){
        callerFunction = callerFunction.caller;
        if (callerFunction.arguments[0]) {
            evtArg = callerFunction.arguments[0];
        }
    }
    console.log(evtArg&&evtArg.type?'event fired by user':'event async');
}

これがフィンドル

他のアプローチはありますか?

4

3 に答える 3

3

最も内側の関数で例外をスローしてキャッチし、その例外を使用してコール スタックを特定することができます。

コール スタックを取得する方法の詳細はベンダー固有です ( e.stackFF ではe.message、Opera では、IE および Safari では大雑把な関数本体の解析)、eriwen.comにはかなり堅牢な実装が存在します。

これは、少なくとも、そのページに投稿された短いスニペットからわかることです。これはGithub で本格的なプロジェクトに発展したため、そのページの 50 行のスニペットよりも信頼性が高く、機能が満載されている可能性が高いことに注意してください。

あなたの例では、次を使用します。

function b(){
    final();
}
function final(){
   var trace = printStackTrace();
   //output trace
}


//This would be attached as the click handler for the anchor
function anchorHandler(){
   b();
}
setTimeout(function timerCallback(){
    b();
}, 1000);

またはトレースにあるかどうかによって、どのイベントが関数呼び出しをトリガーしたかがわかりtimerCallbackます。anchorHandler

于 2013-05-24T14:58:30.640 に答える