0 votes
in SoSci Survey (dt.) by s137689 (175 points)
edited by s137689

Liebes Support-Team,

bei der Funktion "Timer: Countdown über mehrere Seiten" habe ich entsprechend der Anleitung den php-Code auf der FB-Seite, wo der Countdown starten soll, aufgenommen:

// Ablauf der Zeit als Variable $timeout speichern
if (!isset($timeout)) {
  $timeout = strtotime('+120 seconds');
  registerVariable($timeout);
}
// Filter: Zeit abgelaufen?
if (time() > $timeout) {
  goToPage('partNext');
}
// JavaScript zur Anzeige der verbleibenden Zeit
$timeLeft = $timeout - time();
// Statt JS01 muss hier die Kennung des Textes eingetragen werden
show('M105', array(
  '%timeLeft%' => $timeLeft
));

In der Anleitung ist angegeben, dass damit verhindert werden soll, dass durch F5 oder den Zurück-Button der Timer neu startet, leider tut er das dennoch.

Auf den Folgeseiten, auf denen der Timer weiter läuft ist folgender Code:

// Filter: Zeit abgelaufen?
if (time() > $timeout) {
  goToPage('partNext');
}
// JavaScript zur Anzeige der verbleibenden Zeit
$timeLeft = $timeout - time();
// Statt JS01 muss hier die Kennung des Textes eingetragen werden
show('M105', array(
  '%timeLeft%' => $timeLeft
));

Sämtlicher Code ist unverändert von der Hilfe-Seite zum Thema "Countdown über mehrere Seiten" kopiert.

Können Sie mir bitte einen Hinweis geben, wie sich das verhindern lässt?

Vielen Dank vorab!

Viele Grüße


Hier der Java-Code:

<!-- HTML-Element zur Anzeige der Zeit -->
<div id="timeDisplay" style="font-size: 200%; margin: 16px 0; text-align: center">&ndash;</div>
 
<script type="text/javascript">
<!--
 
// Verbleibende Zeit initialisieren
var timeLeft = %timeLeft%;
var timeStart = new Date();
 
// Funkton zur Aktualisierung der Anzeige und Prüfung der Zeit
function updateCountdown() {
  // Zeit berechnen
  var now = new Date();
  var timePage = Math.floor((now.getTime() - timeStart.getTime()) / 1000);  // Vergangene Zeit [Sek.]
  var remain = timeLeft - timePage;
 
  // Zeit abgelaufen?
  if (remain <= 0) {
    remain = 0;
    // Timer stoppen
    window.clearInterval(timerInterval);
    // Eine Meldung anzeigen (optional)
   // alert("Die Zeit ist vorbei.");
    // Den Teilnehmer zur nächsten Seite weiterleiten (optional)
    SoSciTools.submitPage();
  }
 
  // Zeit anzeigen
  var display = document.getElementById("timeDisplay");
  if (!display) {
    return;
  }
  while (display.lastChild) {
    display.removeChild(display.lastChild);
  }
  var minutes = Math.floor(remain / 60);
  var seconds = String(remain - 60 * minutes);
  if (seconds.length < 2) {
    seconds = "0" + seconds;
  }
  var displayText = String(minutes) + ":" + seconds;
  var displayNode = document.createTextNode(displayText);
  display.appendChild(displayNode);
}
 
// Initialisierung
var timerInterval = window.setInterval(updateCountdown, 250);
updateCountdown();
 
// -->
</script>
by SoSci Survey (328k points)
Bitte posten Sie Ihren kompletten PHP-Code (einfach Frage bearbeiten) und formatieren Sie diesen mittels {} auch gleich als Code. Danke.
by s137689 (175 points)
Ich habe den Code formatiert. Können Sie mir bitte helfen mit meiner Frage? Vielen Dank vorab.
by SoSci Survey (328k points)
Danke. Das sieht soweit gut aus. Bitte ergänzen Sie wie folgt ein debug():

$timeLeft = $timeout - time();
debug($timeLeft);

Dann können Sie im Debug-Modus überprüfen, ob die Zeit hier noch stimmt. Wenn ja, dann müssten wir den JavaScript-Code prüfen (bitte ggf. ergänzen). Falls die Zahl hier schon nicht stimmt, hakt es mit der $timeout-Variable.
by s137689 (175 points)
Vielen Dank für die Rückmeldung!
Im Debug-Modus funktioniert es, F5 setzt dort den Timer nicht zurück. Habe den Java-Code oben in den Beitrag kopiert.
by SoSci Survey (328k points)
> Im Debug-Modus funktioniert es, F5 setzt dort den Timer nicht zurück.

Dann müsste es im regulären Verlauf auch funktionieren?!

Sie können gerne testweise unter/statt dem debug() noch folgendes ergänzen:

html('<p>Zeit: '.$timeLeft.' Sek.</p>');
by s137689 (175 points)
Jetzt bin ich auch verwirrt, nun funktioniert es auch im Debug-Modus bei mir nicht mehr?! Zuvor kam noch die Frage ala "sind sie sicher, dass sie aktualisieren wollen, Formular wird neu übermittelt", nun nicht mehr?!
Der html-Befehl macht keinen Unterschied, es wird nur dauerhaft/unverändert "Zeit: 120 Sek." angezeigt.
by SoSci Survey (328k points)
> es wird nur dauerhaft/unverändert "Zeit: 120 Sek." angezeigt.

Dann ergänzen Sie den html()-Befehl bitte wie folgt:

$timeLeft = $timeout - time();
html('<p>Zeitangaben: '.$timeLeft.' = '.$timeout.' - '.time().'</p>');

Dann sollte sich zumindest wieder etwas ändern ;)

Und dann schauen Sie bitte, ob $timeout nach Aufruf der ersten Seite konstant bleibt (wie es sein sollte dank registerVariable()) oder nicht. Und wenn nicht, dann posten Sie bitte auch die vollständige Debug-Information von der Seite nach dem Neu-Laden.

Passiert beim Neu-Laden dasselbe egal ob Sie auf der ersten Seite sind oder auf einer Folgeseite?
by s137689 (175 points)
Der html-Befehl generiert nun folgenden Output: "Zeitangaben: 120 = 1584967244 - 1584967124"
Die Zahlen/Zeitstempel verändern sich beim Neuladen.

Debug sagt (vor und nach dem Neu-Laden):

Debug-Information für $timeLeft:
$timeLeft = 120 (integer)

Der Timer wird nur auf der ersten Seite mit F5 zurückgesetzt, auf den Folgeseiten nicht mehr.

1 Answer

0 votes
by SoSci Survey (328k points)

Der Timer wird nur auf der ersten Seite mit F5 zurückgesetzt, auf den Folgeseiten nicht mehr.

Meine Vermutung ist, dass es kein Fehler im Code/Fragebogen ist, sondern dass Sie jeweils einen neuen Fragebogen starten. Achten Sie bitte einmal auf die Interview-Nummer, die in den Debug-Informationen angezeigt wird.

Anschließend starten Sie den Test bitte auf der vorhergehenden Seite, klicken Sie auf "Weiter" und prüfen Sie, ob der Timer durch F5 auch dann noch neu gestartet werden kann. Wenn nicht, dann ist alles gut :)

by s137689 (175 points)
Tatsächlich, F5 startet auf der ersten Seite ein neues Interview. Ich habe eine Dummy-Seite davor erstellt, nun funktioniert es, wie es soll. Blöd, wenn man Funktionen völlig isoliert testet ;)

Vielen Dank für Ihre Unterstützung und Geduld!

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...