J'écris du Javascript qui interagit avec le code de bibliothèque que je ne possède pas et que je ne peux pas (raisonnablement) changer. Il crée des délais d'expiration Javascript utilisés pour afficher la question suivante dans une série de questions limitées dans le temps. Ce n'est pas du vrai code car il est obscurci au-delà de tout espoir. Voici ce que fait la bibliothèque:
....
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i+1]), t );
Je veux mettre une barre de progression à l'écran qui se remplit questionTime * 1000
en interrogeant la minuterie créée par setTimeout
. Le seul problème est qu'il ne semble y avoir aucun moyen de le faire. Y a-t-il une getTimeout
fonction qui me manque? Les seules informations sur les délais d'expiration Javascript que je peux trouver concernent uniquement la création via setTimeout( function, time)
et la suppression via clearTimeout( id )
.
Je recherche une fonction qui renvoie soit le temps restant avant le déclenchement d'un timeout, soit le temps écoulé après l'appel d'un timeout. Mon code à barres de progression ressemble à ceci:
var timeleft = getTimeout( test.currentTimeout ); // I don't know how to do this
var $bar = $('.control .bar');
while ( timeleft > 1 ) {
$bar.width(timeleft / test.defaultQuestionTime * 1000);
}
tl; dr: Comment trouver le temps restant avant un javascript setTimeout ()?
Voici la solution que j'utilise actuellement. J'ai parcouru la section bibliothèque chargée des tests, et j'ai déchiffré le code (terrible et contre mes autorisations).
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i+1]), t );
et voici mon code:
// wrapper pour setTimeout function mySetTimeout (func, timeout) { timeouts [n = setTimeout (func, timeout)] = { début: nouvelle Date (). getTime (), end: new Date (). getTime () + timeout t: délai d'expiration } return n; }
Cela fonctionne assez parfaitement dans n'importe quel navigateur qui n'est pas IE 6. Même l'iPhone d'origine, où je m'attendais à ce que les choses deviennent asynchrones.