Ich schreibe Javascript, das mit Bibliothekscode interagiert, den ich nicht besitze und den ich (vernünftigerweise) nicht ändern kann. Es werden Javascript-Zeitüberschreitungen erstellt, mit denen die nächste Frage in einer Reihe von zeitlich begrenzten Fragen angezeigt wird. Dies ist kein richtiger Code, da er hoffnungslos verschleiert ist. Folgendes macht die Bibliothek:
....
// 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 );
Ich möchte einen Fortschrittsbalken auf dem Bildschirm anzeigen, der sich questionTime * 1000
durch Abfragen des von erstellten Timers füllt setTimeout
. Das einzige Problem ist, es scheint keine Möglichkeit zu geben, dies zu tun. Gibt es eine getTimeout
Funktion, die mir fehlt? Die einzigen Informationen zu Javascript-Zeitüberschreitungen, die ich finden kann, beziehen sich nur auf das Erstellen über setTimeout( function, time)
und das Löschen über clearTimeout( id )
.
Ich suche nach einer Funktion, die entweder die verbleibende Zeit vor dem Auslösen eines Timeouts oder die nach dem Aufrufen eines Timeouts verstrichene Zeit zurückgibt. Mein Fortschritts-Barcode sieht folgendermaßen aus:
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: Wie finde ich die verbleibende Zeit vor einem Javascript setTimeout ()?
Hier ist die Lösung, die ich jetzt verwende. Ich ging durch den Bibliotheksbereich, der für Tests zuständig ist, und entschlüsselte den Code (schrecklich und gegen meine Berechtigungen).
// 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 );
und hier ist mein Code:
// Wrapper für setTimeout Funktion mySetTimeout (func, timeout) { timeouts [n = setTimeout (func, timeout)] = { start: neues Datum (). getTime (), Ende: neues Datum (). getTime () + Zeitüberschreitung t: Zeitüberschreitung }} return n; }}
Dies funktioniert in jedem Browser, der nicht IE 6 ist, ziemlich genau. Sogar auf dem ursprünglichen iPhone, auf dem ich erwartet hatte, dass die Dinge asynchron werden.