0 votes
in SoSci Survey (dt.) by s291801 (150 points)

Hallo zusammen,
folgendes Problem: Ich habe einen Timer auf einer Seite, wo eine Pflichtauswahl stattfindet. Wenn man bei dieser Frage keine Auswahl getroffen hat und dennoch auf weiter klickt, erscheint die Aufforderung eine Auswahl zu treffen. Soweit so gut, aber leider geht dabei auch der Timer von vorne los. Wie kann ich dafür sorgen, dass der Timer nur einmal läuft und anschließend nicht mehr?
Vielen Dank im Voraus.

by s109993 (11.4k points)
Können Sie mal ihren Code posten?
by SoSci Survey (320k points)
Bitte vermeiden Sie Mehrfachpostings. Danke.

> Wie kann ich dafür sorgen, dass der Timer nur einmal läuft und anschließend nicht mehr?

Was ist, wenn jemand direkt nach dem Start der Seite auf "Weiter" klickt? Soll der Timer dadurch deaktiviert werden?
by s291801 (150 points)
Direkt nach dem Start ist der Button Weiter nicht zu sehen, erst wenn der Timer abgelaufen ist. Dafür ist der Timer gedacht. Dieser soll einfach nur nicht wieder erscheinen und den Button wieder verdecken, wenn man in geklickt hat, aber noch eine Pflichtauswahl auf der Seite aussteht. Code habe ich angehängt
by SoSci Survey (320k points)
Bitte schreiben Sie den HTML-/JavaScript-Code im ersten Schritt nicht direkt in den Fragebogen, sondern in einen "Text" im Fragenkatalog. Diesen Text binden sie dann via PHP-Code und text() in die Seite ein. Sagen Sie Bescheid, wenn das funktioniert, dann geht es weiter.

2 Answers

0 votes
by s291801 (150 points)
    <p align="right"><font size="4">Weiter am Ende des Songs in:</font><br></p>
<script type="text/javascript">


<!--

var countdown = 280;
var countdownDisplay;
var countdownTimer;
// "submit0" ist der Weiter-Knopf,
// mit "buttonsAuto" kann man auch den Zurück-Knopf ausblenden
var buttonID = "submit0";  



function countdownStart() {
  // Next button
  var button = document.getElementById(buttonID);
  // Create countdown element
  countdownDisplay = document.createElement("div");
  var cd = countdownDisplay;
  cd.style.display = "inline-block";
  cd.style.textAlign = "center";
  cd.style.fontWeight = "bold";
  cd.style.width = button.offsetWidth + "px";
  cd.style.height = button.offsetHeight + "px";
  // Init countdown
  button.parentNode.appendChild(countdownDisplay);
  countdownRefresh();
  // Hide next button
  button.style.display = "none";
  // Start countdown
  countdownTimer = window.setInterval(countDown, 1000);
}
 
function countDown() {
  if (countdown > 1) {
    countdown--;
    countdownRefresh();
  } else {
    window.clearTimeout(countdownTimer);
    // Display nextbutton
    var button = document.getElementById(buttonID);
    button.style.display = "";
    // Remove countdown
    button.parentNode.removeChild(countdownDisplay);
  }
}
 
function countdownRefresh() {
  // Clear
  while (countdownDisplay.lastChild) {
    countdownDisplay.removeChild(countdownDisplay.lastChild);
  }
  // Display
  var content = document.createTextNode(countdown + " Sek.");
  countdownDisplay.appendChild(content );
}
 
SoSciTools.attachEvent(window, "load", countdownStart);

// -->
</script>

Ich habe diesen Code als Textbaustein in einer Seite eingebaut. Im Fragenkatalog hat der die Kennung S113. Er sorgt dafür, dass der Weiter-Button nach 280 Sekunden erscheint. Auf der Seite gibt es eine Frage, die eine Pflichtauswahl enthält. Klickt man den erschienenen Weiterbutton ohne zuvor die Frage beantwortet zu haben, geht der Timer von vorne los und der Weiterbutton verschwindet wieder. Was ich möchte: Selbst wenn man vergessen hat die Frage zu beantworten, soll man dazu aufgefordert werden, dies dann erledigen müssen, aber nicht mehr den ganzen Timer abwarten müssen.

Es scheint eine Lösung mit diesem Code zu geben:

if (!isset($timerShown)) {

text('XX01');  // Der HTML-/JavaScript-Code für den Timer, z.B. abgelegt in XX01
$timerShown = true;
registerVariable($timerShown); }

Leider kann ich nicht herausfinden wo ich diesen einbinden muss.

0 votes
by s109993 (11.4k points)
if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}
// Prüfung, ob die Zeit schon abgelaufen ist
// (z.B. weil der Teilnehmer die Seite neu geladen hat)
$timer = 60;  // Der Teilnehmer hat 1 Minute (60 Sekunden) Zeit zur Bearbeitung
if (time() >= $time0 + $timer) {
  goToPage('next');
}
// Die verbleibende Zeit muss auch dem JavaScript-Code bekannt gemacht werden
$remain = $time0 + $timer - time();
replace('%remain%', $remain);

Hier ist ein Beispiel wie sie isset und register Variable verwenden: https://www.soscisurvey.de/help/doku.php/de:create:timer-submit

by s291801 (150 points)
Ich habe diesen Code in einem PHP Feld auf der Seite eingefügt. Der hat jetzt bewirkt, dass bei klicken auf den Weiter-Button die nächste Seite geladen wird. Leider nicht berücksichtigend, ob die Frage auf der Seite mit dem Timer beantwortet wurde. Was habe ich da falsch gemacht?

Hier noch einmal mein Ziel:
Die Seite enthält eine Pflichtauswahlfrage. Man soll die Seite erst nach Ablauf des Timers verlassen können. Klickt man auf weiter ohne die Pflichtfrage beantwortet zu haben, soll die Aufforderung erscheinen die Frage zu beantworten OHNE dass der Timer neugestartet wird.
by s291801 (150 points)
if (time() >= $time0 + $timer) {
  goToPage('next');
}

Ich vermute mal, dass das goToPage die Prüfung der Pflichtauswahl einfach übergeht. Kann man da noch etwas reinschreiben, wodurch das verhindert wird?

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

...