0 votes
in SoSci Survey (dt.) by s066509 (165 points)

Liebes SoSci Survey-Team,

ich habe einen (zehntelsekundengenauen) Countdown eingerichtet (der an sich gut funktioniert hat) und bemerkt, dass dieser bereits zu zählen beginnt, wenn die Seite noch nicht vollständig geladen ist. Somit zählt der Timer bereits vor dem "Sichtbar werden" des anzuzeigenden Stimulus der Seite, wodurch sich die Bearbeitungszeit um einige Zehntelsekunden verkürzt. Daher soll eine Funktion implementiert werden, die das vollständige Laden der Seite kennzeichnet. (Es soll dabei nicht wie üblich ein Zeitdifferenz-Verweis aus dem php Code erfolgen. Daher stellt der Verweis %remain2% einen absoluten Zeitwert dar.)

Folgendes Script verwende ich momentan:

    > <script type="text/javascript">
<!--
function weiter() {
  SoSciTools.submitPage();
}
window.addEventListener("load", function() {
var pageLoad = new Date();
});
// Countdown anzeigen
var date0 = new Date();
var timeout = pageload.getTime() + %remain2%;
function updateCountdown() {
  // Zeit berechnen
  var date = new Date();
  var time = Math.ceil((timeout - date.getTime()) / 100);  // Verbleibende Zeit in Sekunden
  // Zeit anzeigen
  var out = document.getElementById("remain");
  if (!out) {
    return;
  }
  while (out.lastChild) {
    out.removeChild(out.lastChild);
  }
  var seconds = Math.floor(time /10);
  var ms = String(time - 10 * seconds );
  var display = "0" + seconds + ":" + ms + "0";
  var displayNode = document.createTextNode(display);
  out.appendChild(displayNode);
}
// Initialisierung der Weiterleitung
SoSciTools.attachEvent(window, "load", function(evt) {
  // Weiter-Knopf ausblenden (optional)
  SoSciTools.submitButtonsHide();
  // Zusätzlicher Timer für die Aktualisierung des Countdowns
  window.setInterval(updateCountdown, 100);
  updateCountdown();
  // Timer für automatische Weiterleitung starten
  window.setTimeout(weiter, %remain2%);
});
// -->
</script>

Es scheint jedoch so zu sein, dass der load-Befehl nicht richtig eingebunden bzw. nicht korrekt mit der "Zeitmessung" (var timeout) verknüpft ist. In der Browser-Fehlerkonsole wird die Fehlermeldung "can't find variable PageLoad" ausgegeben.

Danke und viele Grüße
Daniel

1 Answer

0 votes
by SoSci Survey (304k points)

Der Haken liegt hier:

var pageLoad = new Date();
...
var timeout = pageload.getTime() + %remain2%;

Bereits während der Quellcode der Seite übertragen wird (also viele hundertstel Sekunden bevor das Bild geladen ist) definieren Sie, wann die Zeit vorbei ist. Definiert durch die aktuelle Zeit (beim Laden) und die gegebene Zeit aus dem Platzhalter %remain2%.

Kleinigkeit: Das L ist einmal groß geschrieben, einmal klein. Das wird nicht funktionieren.

SIe Lösung ist entsprechend einfach: Definieren Sie hier nur die Variable var timeout; und setzen Sie diese erst im onload Block weiter unten:

var pageLoad = new Date();
timeout = pageLoad.getTime() + %remain2%;
by s066509 (165 points)
Perfekt! Hat sofort funktioniert. Vielen Dank!

Ich hatte mir schon gedacht, dass das Problem daran liegen könnte und hatte es mit einer "readyStateCheckInterval"-Funktion versucht aber habe es nicht geschafft, diese richtig einzubinden. Jetzt ging es noch einfacher.

Noch eine Frage: Wie oben geschrieben, gebe ich per php einen statischen Zeitwert für den Timer an JavaScript weiter (%remain2%), um erst dort die Differenz nach dem vollständigen Laden der Seite zu berechnen. Wie in der Vorlage vorgesehen, belasse ich aber die übliche Berechnung (if (microtime(true) >= $time27 + $timer) {  goToPage('next');) bei, um bei erneutem Laden die Weiterleitung sicherzustellen. Ist das so ein sinnvolles Vorgehen?

Mein php code sieht folgendermaßen aus:

if (!isset($time27)) {
  $time27 = microtime(true);
  registerVariable($time27);
}
$timer = $ZeitFB; //Wert in ms, z.B. 5000
if (microtime(true) >= $time27 + $timer) {
  goToPage('next');
}
replace('%remain2%', $timer);

Vielen Dank!

// ps: Wie erzeuge ich eine Code-Box auf dem Mac?
by SoSci Survey (304k points)
> Ist das so ein sinnvolles Vorgehen?

In Grenzfällen, z.B. wenn die Seite in den letzten Sekunden erneut geladen wird, könnte es zu Ungenauigkeiten kommen. Aber ich denke, in diesem Fall sind andere Messfehler deutlich relevanter.

> Wie erzeuge ich eine Code-Box auf dem Mac?

Diese Frage müssten Sie mir bitte nochmal genauer erklären. Zickt Safari beim Zusammenstellen des Fragebogens?
by s066509 (165 points)
Nochmals Danke!

>In Grenzfällen, z.B. wenn die Seite in den letzten Sekunden erneut geladen wird, könnte es zu Ungenauigkeiten kommen. Aber ich denke, in diesem Fall sind andere Messfehler deutlich relevanter.

Ich schätze, bis zum erneuten Abruf müsste in dem Fall ja die Zeit auch komplett abgelaufen sein und die Weiterleitung dann über php greifen. Oder übersehe ich etwas?

>Diese Frage müssten Sie mir bitte nochmal genauer erklären. Zickt Safari beim Zusammenstellen des Fragebogens?
Das war nur auf diese Support Seite bezogen. Mir werden die Optionen zur Textformatierung nicht angezeigt. Vermutlich kann ich auch einen Code verwenden, um die den Code in die Box zu setzen oder?
by SoSci Survey (304k points)
Die Textformatierung wird nur bei Fragen und Antworten angezeigt - nicht für Kommentare. Für Safari habe ich es tatsächlich noch nicht ausprobiert. Aber nachdem die meisten Nutzer den Knopf {} ohnehin nicht nutzen ...

Die Formatierung würde durch Einrücken des Codes um 4 Leerzeichen erfolgen. Aber wenn es mehr als 3 Zeilen sind, ist das ohne den entsprechende Knopf müßig. Und ich korrigiere Fragen ohnehin entsprechend, wenn ich den Code nicht lesen kann ;)

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

...