Sto scrivendo del Javascript che interagisce con il codice della libreria che non possiedo e che non posso (ragionevolmente) modificare. Crea timeout Javascript utilizzati per mostrare la domanda successiva in una serie di domande a tempo limitato. Questo non è un codice reale perché è offuscato oltre ogni speranza. Ecco cosa sta facendo la libreria:
....
// 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 );
Voglio mettere una barra di avanzamento sullo schermo che si riempie questionTime * 1000
interrogando il timer creato da setTimeout
. L'unico problema è che non sembra esserci alcun modo per farlo. C'è una getTimeout
funzione che mi manca? Le uniche informazioni sui timeout Javascript che posso trovare sono relative solo alla creazione tramite setTimeout( function, time)
e alla cancellazione tramite clearTimeout( id )
.
Sto cercando una funzione che restituisca il tempo rimanente prima che si attivi un timeout o il tempo trascorso dopo che è stato chiamato un timeout. Il mio codice a barre di avanzamento ha questo aspetto:
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: come faccio a trovare il tempo rimanente prima di un javascript setTimeout ()?
Ecco la soluzione che sto usando ora. Ho esaminato la sezione della libreria che si occupa dei test e ho decodificato il codice (terribile e contro i miei permessi).
// 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 );
ed ecco il mio codice:
// wrapper per setTimeout function mySetTimeout (func, timeout) { timeout [n = setTimeout (func, timeout)] = { inizio: nuova data (). getTime (), fine: nuova data (). getTime () + timeout t: timeout } return n; }
Funziona perfettamente in qualsiasi browser che non sia IE 6. Anche l'iPhone originale, dove mi aspettavo che le cose diventassero asincrone.