0

私はこのコードで問題なく動作しますが、ユーザーが連続ループではなく、たとえば5回の反復後に非アクティブ(マウスの移動なし)の場合は、ポーリングとclearIntervalを停止したいと思います。

var i, active = new Date, iter = 1;

$(window).on('mousemove', function(e){
active = new Date;          
});

i = setInterval(function(){
    if(new Date().getTime() - active.getTime() < 1000){
     console.log("sending active event to server.....");
             iter = 1;  
    else{
      iter++;
        if(iter >= 5){
           clearInterval(i);
        }
     }          
}, 2000);   

現在、この例では2秒ごとにチェックしています。アクティブな日付を5回確認したいのですが、5回続けて期限切れになった場合は、clearInterval(i)...を呼び出します。したがって、mousemoveコールバック内の何かが、現在実行されていない場合にのみsetIntervalを再初期化する必要があります。どうすればこれを達成できますか?ヒントとサンプルをありがとう。可能であれば匿名関数を使い続けたいです。

4

2 に答える 2

1

インターバル機能を分離する

function intFunc(){
    if(new Date().getTime() - active.getTime() < 1000){
     console.log("sending active event to server.....");
             iter = 1;  
    else{
      iter++;
        if(iter >= 5){
           clearInterval(i);
        }
     }          
};

今、あなたが必要とする2つの場所でそれらを呼び出します

var i;
$(window).on('mousemove', function(e){
  active = new Date;          
  i = setInterval(intFunc, 2000);

});
i = setInterval(intFunc, 2000);
于 2012-04-29T16:31:45.507 に答える
0

簡単な方法の 1 つは、clearInterval 呼び出しを削除し、代わりにiter < 5.

しかし、ハンドラーは何もする必要がないときにまだ呼び出されているため、これはまだ少し無駄です。つまり、基本的にはあなたが持っているものですが、clearInterval を呼び出した後、ポーリングを再開する 1 回限りの mousemove ハンドラーをセットアップします。

関数に名前を付けずにそれを行う方法はわかりませんが (Y コンビネーターなどには入りたくないのではないかと思います)、その名前やその他の名前を外の世界から隠すことはできます。全体に匿名関数を使用することにより:

(function () {
    var i, active = new Date, iter = 1;

    $(window).on('mousemove', function(e) {
        active = new Date;
    });

    function startPolling() {
        i = setInterval(function() {
            if (new Date().getTime() - active.getTime() < 1000) {
                console.log("sending active event to server.....");
                iter = 1;
            }
            else{
                iter++;
                if (iter >= 5) {
                    clearInterval(i);
                    $(window).one('mousemove', function () {
                        startPolling();
                    });
                }
            }
        }, 2000);
    }

    startPolling();
})();
于 2012-04-29T17:03:01.703 に答える