0

次の構造の jquery プラグインを作成しました。

(function($){

var timer_handle, i = 5 ;

 $.my_plugin = function(){
  return{
    // provide $.my_plugin.reset() public method to reset
    reset : function(){ clearTimeout(timer_handle); }
  }
}();

 $.fn.my_plugin = function(){

    // init codes ...

    function tick(){
      i -= 1;
      console.log(i+'sec elapsed');
      if(i == 0){
      console.log('time over');   
      $.my_plugin.reset();
      }
        timer_handle = setTimeout(tick, 1000);
    }
    tick();
 }
 })(jQuery);

$('body').my_plugin();

console を見ると、0 秒が経過した後も、カウンターはまだ負の状態で実行されています。つまり、setTimeout はクリアされていません。私が調べたように、パブリックメソッド $.my_plugin.reset(); 外部から呼び出されてタイマーをクリアしますが、ティッククロージャー内で呼び出された $.my_plugin.reset() はタイマーをクリアしません。

そのような場合の解決策は何ですか?????

4

1 に答える 1

0

関数内$.my_plugin.reset();から呼び出しているため、クリアするタイムアウトはありません。以前にスケジュールされたタイムアウトが既に発生しているため、実行中です。(これは、コードがクロージャ内にあるかどうかとは関係ありません。)tick()tick()

i代わりに、に達した場合は次のタイムアウトを設定しないでください0:

function tick(){
  i -= 1;
  console.log(i+'sec elapsed');
  if(i == 0){
    console.log('time over');
  } else {
    timer_handle = setTimeout(tick, 1000);
  }
}

外部$.my_plugin.reset();の他のコードから呼び出すと、クリアできる未解決のタイムアウトが発生し、再度実行が停止ます。 tick() tick()

timer_handleすぐに呼び出される匿名関数で変数と変数を宣言するとi、プラグインへのすべての呼び出しが同じ変数にアクセスすることになるため、ページ上の複数の要素に対してプラグインを同時に実行すると、正しくない動作になることに注意してください。

于 2012-08-11T12:57:39.400 に答える