2010-12-16 8 views
0

5分ごとに新しいデータを連続的に取得する必要がありますが、ユーザーがそのページでアクティブな場合のみです。文書がロードされるとイベントハンドラがトリガーされた後にのみ関数を実行する

  1. 、データを取得し、基本的に5分間機能をスリープ状態にsetTimeoutメソッドを使用します。ここでは

    は、私の進捗状況/考えは今のところです。

  2. 5分後に機能が実行されますが、ユーザーがページの一部をマウスオーバーするとデータが更新されます。

    setTimeout(getData, 10000) // Shortened time for testing purposes 
    function getData(){ 
        $('#feed').mouseover(function(){ 
         $('#feed').fadeOut(); 
         Get the feed 
         setTimeout(getData, 10000); 
        }); 
    } 
    

これを行うには良い方法はありますか?

+1

イベントハンドラを繰り返し追加します。つまり、毎回**イベントハンドラを追加することになります。 –

+0

@Felix - +1、ええ、私はイベントハンドラをアンバウンドします。 –

答えて

1

は、より良い方法があるかもしれませんが、この例のために、あなたはそうのようunbind.mouseoverにする必要があります:

setTimeout(getData, 10000) // Shortened time for testing purposes 
function getData(){ 
    $('#feed').mouseover(function(){ 
     $('#feed').fadeOut(); 
     Get the feed 
     $(this).unbind('mouseover'); 
     setTimeout(getData, 10000); 
    }); 
} 

そうでない場合はイベントがまだ拘束され、あなたは関係なく、タイムアウトのフィードを呼び出しておこう

+0

ええ、話しているうちに、私はその問題を横断しました。提案していただきありがとうございます。 –

0

@ Jacobの答えに基づいて、フラグを使用してしばらくしてからfalseに設定することができます。あなたは、バックグラウンドで実行されているデータを取得するあなたの機能を維持し、そのフラグをチェックすることもできます

var active = true; 
var current_timeout = null; 

function idle() { 
    active = false; 
    current_timeout = null; 
} 


$('#feed').mousemove(function(){ 
    // maybe another event that does not 
    // constantly fire (but often enough) is enough 

    active = true; 
    if(current_timeout !== null) { 
     window.clearTimeout(current_timeout); 
    } 
    timeout = window.setTimeout(idle, 180000); // mark not active after 3 minutes 
}); 

window.setInterval(function() { 
    if(active) { 
     //get data 
    } 
), 300000); 

間隔の実行を持っている、それはあまりにも不必要ではない場合しかし、ユーザーがページ上ではありませんが、私はわからない(が、 activeが偽である限り何もしません)。あなたはそれをテストしなければなりません。