2009-07-29 4 views
4

Est-ce que quelqu'un sait comment je peux écrire une fonction Javacript qui retourne vrai si le moteur Javascript du navigateur a été inactif pendant un certain temps?Comment puis-je détecter l'oisiveté Javascript?

Je suis heureux d'utiliser mootools/jQuery etc si c'est plus facile, avec une légère préférence pour mootools.

EDIT:

Mon problème réel: Je fais un appel à l'API une 3ème partie. L'appel revient immédiatement mais le travail effectué sur le DOM dure quelque temps (> 10 secondes dans de nombreux cas). Je veux que mon code s'exécute dès que le travail DOM est terminé. Je ne connais rien aux internes de la fonction API que j'appelle, donc je cherchais un moyen générique de déterminer si la fonction était terminée.

Répondre

3

Si vous appelez une telle fonction, cela ne réinitialisera-t-il pas un compteur de temps d'inactivité, en supposant qu'il existe?

Si vous pouviez décrire le problème que vous essayez de résoudre, il se peut que nous puissions vous donner un coup de main. Je peux penser à des manières que j'approcherais pour résoudre le problème de "combien de temps cela a-t-il duré depuis cette fonction" ou "combien de temps depuis le dernier événement sur la page" ou "fais quelque chose si l'utilisateur a été sur cette page pour X secondes ", mais je ne sais pas s'il y a une bonne façon de faire" faites ceci seulement quand rien ne s'est passé pendant X secondes ".

Mise à jour

Sur la base de votre mise à jour, je recherche un mécanisme de rappel dans l'API (pourriez-vous partager ce qu'il est?) Qui vous permet de planifier un travail pour après l'API est terminée . Si cela ne fonctionne pas, vous pouvez essayer d'ajouter quelque chose comme:

setTimeout(function() { myCallbackMethod(); }, 0); 

Ce programmera votre rappel pour commencer une fois que l'exécution en cours est terminée. Cela dépend du fait que le moteur javascript soit mono-thread, mais je l'ai vu utilisé à bon escient.

+0

J'ai ajouté à ma question. – jjujuma

0

Il existe deux faits que vous pouvez exploiter pour mesurer l'oisiveté du thread javascript/flash.

  1. sources Javascript (timing setTimeout, setInterval) qui ne cocher que si javascript est inactif. Ainsi, moins le fil est inactif, plus la minuterie est lente.

    « JavaScript ne peut jamais exécuter un morceau de code à un moment (en raison de sa nature mono-thread ) chacun de ces blocs de code sont « blocage » du progrès d'autres événements asynchrones. Cela signifie que lorsqu'un événement asynchrone se produit (comme un clic de souris, un tir ou un XMLHttpRequest ), il est mis en file d'attente pour être exécuté plus tard. " How JavaScript Timers Work

  2. Javascript une source de synchronisation externe tiques indépendamment de l'oisiveté. L'instance de classe Date() est basée sur une horloge externe, vous pouvez obtenir une synchronisation de la milliseconde en utilisant getTime():

    var timeSinceDisco = (nouvelle date) .getTime();

eJohn a quelques tests intéressants using getTime() for benchmarking.

Nous utilisons la différence entre le temporisateur externe Date.getTime() et l'heure interne setTimeout pour calculer le degré d'inactivité du thread javascript. Bien sûr, cela ne fonctionnera pas aussi bien sur les nouveaux moteurs javascript sexy comme V8 ou tracemonkey car ils utilisent plus d'un thread. Cela devrait fonctionner pour la plupart des navigateurs actuellement disponibles.

Lessons from Gmail: Using Timers Effectively

+1

Êtes-vous sûr que ce ne dépend pas de la mise en œuvre? – Cide

+1

je suis d'accord avec Cide, mais sinon une approche intelligente – jlarson

+0

@Cide Dans mon expérience, setTimeout fonctionne de la même manière sur tous les moteurs js multithread. Je suis d'accord cependant que c'est probable qu'il y a un comportement assez difficile différents entre les navigateurs. –

0

Je suis certain 99,4% il n'y a cependant pas de cette fonction, je souhaite qu'il y ait parce que je vraiment besoin.

Bien sûr, vous pouvez créer votre propre solution ici (une fonction que vous appelez au début de chaque fonction de point d'entrée), en fonction des détails pourrait être faible surcharge.

var Tracker={ 
last: new Date().geTime(), 
activity:function() { this.last=new Date().geTime(); }, 
idle:function() { return new Date().geTime()-this.last; } 
} 


... 

var clickedSomething=function() { 
Tracker.activity(); 
...real code.. 
} 
0

Vous pouvez appeler une fonction pour vérifier les positions X et Y de la souris à chaque intervalle de temporisation, et les comparer à la dernière position X et Y sauvegardée, si elles sont identiques, donc inactive.

MooTools Sample

+0

Même commentaire qu'à @Kip: Ceci est "l'utilisateur est-il inactif?" pas "le moteur javascript est-il inactif?" – tvanfosson

Questions connexes