2010-12-16 4 views
0

Je dois continuellement récupérer de nouvelles données toutes les 5 minutes, mais uniquement si l'utilisateur est actif sur la page.Fonction Run uniquement après le déclenchement du gestionnaire d'événements

Voilà mes progrès/pensées jusqu'à présent:

  1. Lorsque le document est chargé, obtenir les données et utilisent la méthode setTimeout pour dormir essentiellement fonction pendant 5 min.
  2. Après 5 min, la fonction s'exécutera, mais ne mettra à jour les données que si l'utilisateur survole une section de la page.

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

Y at-il une meilleure façon de le faire?

+1

Vous allez attacher le gestionnaire d'événements encore et encore. Cela signifie que vous allez ajouter ** un gestionnaire d'événements à chaque fois .... –

+0

@Fixix - +1, ouais Je ne liez pas le gestionnaire d'événements. –

Répondre

1

Il peut y avoir une meilleure façon, mais pour cet exemple, vous aurez besoin de la unbind.mouseover comme ceci:

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

Sinon, l'événement sera toujours lié et vous continuer à appeler l'alimentation quel que soit le délai d'attente

+0

Ouais, je viens de traverser cette question en ce moment même. Merci pour la suggestion. –

0

Basé sur la réponse de @ Jacob, vous pouvez utiliser un indicateur et après un certain temps, réglez-le sur false. Vous pouvez garder votre fonction qui récupère les données en cours d'exécution en arrière-plan et vérifier que le drapeau:

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); 

Je ne suis pas sûr que si elle pas trop inutile d'avoir la course d'intervalle, bien que l'utilisateur n'est pas sur la page (bien que il ne fera rien tant que active est faux). Vous devez tester cela.

Questions connexes