0 votes
in SoSci Survey (dt.) by s333375 (120 points)
edited by s333375

Hallo,

In einem Block folgen zwei Seiten direkt aufeinander, beide enthalten jeweils eine Schiebereglerfrage. Diese Fragen sind als Pflichtfragen definiert und müssen aktiv beantwortet werden, bevor zur nächsten Seite gewechselt werden kann.

Zusätzlich läuft ein Timer, der auf der ersten Seite beginnt und auf der zweiten Seite weiterläuft. Nach Ablauf der Zeit soll automatisch zur zum Beginn des nächsten Blocks weitergeleitet werden.

Das Problem: Wenn der Schieberegler auf der ersten oder zweiten Seite nicht bewegt wurde (also die Pflichtfrage nicht erfüllt ist), kommt es nach Ablauf des Timers zu einem Konflikt – die Seite hängt sich auf oder lädt sich endlos neu, weil das automatische Weiterleiten mit der Pflichtfrage kollidiert.

Frage:
Gibt es eine Möglichkeit, Schiebereglerfragen als Pflichtfragen beizubehalten und dennoch nach Ablauf der Zeit automatisch zur nächsten Seite weiterzuleiten – ohne dass es zu einem Konflikt oder Endlos-Reload kommt?

Hier ein Link zum Pretest: https://survey.charite.de/block/?act=WP4qCwpuxkBH4hvHplNOLmZo

Über eine Rückmeldung freue ich mich sehr.
Vielen Dank!

1 Answer

0 votes
by SoSci Survey (352k points)

Gibt es eine Möglichkeit, Schiebereglerfragen als Pflichtfragen beizubehalten und dennoch nach Ablauf der Zeit automatisch zur nächsten Seite weiterzuleiten

Ja, die gibt es. Und zwar haben Sie in der Anleitung zum Timer gesehen, dass man eine PHP- und eine JavaScript-Komponente kombinieren kann. Die JavaScript-Komponente läuft während der Teilnehmer auf der Seite ist, die PHP-Komponente läuft beim Laden der Seite.

Wenn Sie die PHP-Komponente vor den Schieberegler setzen, dann kann diese beim erneuten Laden der Seite (weil die Antwort fehlt) eingreifen und direkt zur anderen Seite springen bevor der Schieberegler überhaupt erstellt/eingebunden wird.

by s333375 (120 points)
Wir haben versucht, das nach der Anleitung zum Timer aufzubauen und sind dennoch bisher zu keiner Lösung gekommen. Zurzeit haben wir immer noch das Problem, dass nach Ablauf der Zeit nicht zum nächsten Block gesprungen wird, da der Schieberegler als Pflichtfrage besteht.
Ohne Randomisierung konnten wir den goToPage() Befehl nutzen, dort hat es dann geklappt. Leider bekommen wir das nicht in die Randomisierung übertragen.
Haben Sie noch einen Tipp? Vielen Dank im Voraus!

Hier der derzeitige Code (erst danach folgt der Schieberegler) für die erste Seite eines zweiseitigen Blocks. Nach Ablauf der Zeit sollte es eigentlich zur in der Randomisierung gezogenen nächsten Block springen:

<!-- Anzeigeelement -->
<div id="timeDisplay"
     style="font-size:200%;margin:16px 0;text-align:center">–</div>

<script type="text/javascript">
var timeLeft = %timeLeft%;      // Platzhalter wird per PHP ersetzt
var timeStart = new Date();

function updateCountdown() {
  var remain = timeLeft - Math.floor((new Date() - timeStart)/1000);
  if (remain <= 0) {
    remain = 0;
    clearInterval(timerInterval);
    // optional:
    // alert("Die Zeit ist vorbei.");
    SoSciTools.submitPage();    // automatisch weiter
  }
  var m = Math.floor(remain/60);
  var s = String(remain - m*60).padStart(2,"0");
  document.getElementById("timeDisplay").textContent = m + ":" + s;
}
var timerInterval = setInterval(updateCountdown, 250);
updateCountdown();
</script>

----

/* 0 | Wenn Timer schon abgelaufen → Restzeit auf 0 setzen          */
if (isset($timeout) && time() >= (int)$timeout) {
    $timeLeft = 0;                        // JS springt gleich weiter
} else {

    /* 1 | Seite & Zeitlimit holen -------------------------------- */
    $pageID  = info('pageID');            // z. B. V0101
    $seconds = $durPages[$pageID];        // 20 oder 40 s

    /* 2 | Timer nur einmal pro Block anlegen --------------------- */
    if (!isset($timeout)) {
        $timeout = time() + $seconds;
        registerVariable($timeout);
    }
    $timeLeft = $timeout - time();        // verbleibende Sekunden
}

/* 3 | Countdown-Baustein einfügen -------------------------------- */
show('V109', ['%timeLeft%' => $timeLeft]);   // V109 = dein JS-Countdown


Hier der Code der zweiten Seite des zweiseitigen Blocks:

<!-- Anzeigeelement -->
<div id="timeDisplay"
     style="font-size:200%;margin:16px 0;text-align:center">–</div>

<script type="text/javascript">
var timeLeft = %timeLeft%;      // Platzhalter wird per PHP ersetzt
var timeStart = new Date();

function updateCountdown() {
  var remain = timeLeft - Math.floor((new Date() - timeStart)/1000);
  if (remain <= 0) {
    remain = 0;
    clearInterval(timerInterval);
    // optional:
    // alert("Die Zeit ist vorbei.");
    SoSciTools.submitPage();    // automatisch weiter
  }
  var m = Math.floor(remain/60);
  var s = String(remain - m*60).padStart(2,"0");
  document.getElementById("timeDisplay").textContent = m + ":" + s;
}
var timerInterval = setInterval(updateCountdown, 250);
updateCountdown();
</script>

----
/* 0 | Wenn Timer schon abgelaufen → Restzeit auf 0 setzen          */
if (isset($timeout) && time() >= (int)$timeout) {
    $timeLeft = 0;                        // JS springt gleich weiter
} else {

    /* 1 | Seite & Zeitlimit holen -------------------------------- */
    $pageID  = info('pageID');            // z. B. V0101
    $seconds = $durPages[$pageID];        // 20 oder 40 s

    /* 2 | Timer nur einmal pro Block anlegen --------------------- */
    if (!isset($timeout)) {
        $timeout = time() + $seconds;
        registerVariable($timeout);
    }
    $timeLeft = $timeout - time();        // verbleibende Sekunden
}

/* 3 | Countdown-Baustein einfügen -------------------------------- */
show('V109', ['%timeLeft%' => $timeLeft]);   // V109 = dein JS-Countdown
by SoSci Survey (352k points)
> Ohne Randomisierung konnten wir den goToPage() Befehl nutzen, dort hat es dann geklappt.

Der Befehl steht in jedem Fall oberhalb der Frage - insofern sollten Sie diesen auch verwenden können, wenn Sie darüber hinaus eine Randomisierung verwenden.
by s333375 (120 points)
Zurzeit ist das Problem, dass wir mit goToPage() nur eine bestimmte Seite ansteuern können und nicht den sich aus der Randomisierung ergebenen nächsten Block.
Meinen Sie damit, dass eine der goToPage () Befehl auch mit einer Randomisierung anwendbar ist? Wenn ja, haben Sie einen Tipp, wie das umzusetzen ist?
Bitte entschuldigen Sie die vielen Nachfragen. Vielen Dank!
by SoSci Survey (352k points)
Eventuell reicht es schon, wenn Sie mit `goToPage('next')` arbeiten, was sich immer auf die folgende Seite bezieht - damit wird die Seite, auf der es (ganz oben) steht, einfach übersprungen. Wenn Sie pro Block 2 Seiten haben, müssen Sie diesen Code auf beiden Seiten oben platzieren. Wenn es viele Seiten sind, dann wird es in der Tat ein wenig anspruchsvoller. Aber auch das wäre lösbar.

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

...