2017-12-11 5 views
0

jQuery関数を中心にロギングデコレータを作成したいと思いますが、初期化時には1回だけ呼び出されます。それを修正するには?コードを見てください。JQuery関数をオーバーライドする(ログデコレータ)

クリックイベントは、呼び出された関数に関するメッセージを表示しません。

+0

使用 '$(タスク).on(...)'私が使用 –

+0

'$(タスク).on(...)'しかし、私はこの機能をラップ必要ログデコレータ。私は、この関数が呼び出されたという情報と、呼び出された引数とセレクタを取得する必要があります。これは必ずしも 'on'関数である必要はありませんが、間違いなくjQuery関数です – AZawalar

答えて

0
答えの

コード例

function makeLogging(f) { 

    function auxiliaryWrapper(x, rest) { 
    return() => { 
     console.log(f.name); 
     console.log(rest); 
     x(); 
    } 
    } 

    function mainWrapper(...rest) { 
     const restWithWrap = rest.map(arg => { 
     if (typeof arg === 'function') { 
      return auxiliaryWrapper(arg,rest); 
     } 
     return arg; 
     }); 
     console.log(restWithWrap); 
     return f.apply(this, restWithWrap); 
    } 

    return mainWrapper; 
} 

const task = $('.task'); 

task.on = makeLogging(task.on); 

task.on('click',() => console.log('hi')); 
1

あなたが達成したいアイデアを捉えたら、少し間違っています。機能性のために、あなたが説明し、以下試してください。あなたの元のコードで

task.on('click', makeLogging(() => console.log('hi'))); 

を、あなたはon()機能の機能を包んだが、このon()機能は、イベントハンドラとして呼び出されていない - それだけで、実際のイベントハンドラをインストールします。そのため、ロギングはハンドラのインストール中に一度だけ呼び出されます。

+0

実際のイベントハンドラ'など)情報。この関数が呼び出されるたびに、私はそれを呼び出すことに関するすべての情報が必要です – AZawalar

+0

しかし、 'on'などは実際のイベントハンドラではありません。あなたのケースでは '()=> console.log( 'hi')'は実際のイベントハンドラです。これは、あなたのデコレータが 'on'関数のためにデコレータをインストールしていて、' task.on( 'click'、()=> console.log( 'hi')を発行したときに、 )); 'コマンド。 –

+0

はい、私はそれを昨日理解し、解決しました。今私は働いたコードを持っています。助けてくれてありがとう – AZawalar

関連する問題