0 votes
in SoSci Survey (dt.) by s109993 (10.3k points)

ich will einen normalen alert anzeigen lassen, nachdem ein Teilnhemer 5 Minuten innterhalb von mehren Seiten war.

if (!isset($timeout)) {
  $timeout = strtotime('+10 seconds');  // zu Test zwecken 
  registerVariable($timeout);
}


// Filter: Zeit abgelaufen?
if (time() >= $timeout) {
  html('<script>alert("I am an alert box!");</script>');
}

Das funktioniert mit dem Code ok, allerdings erscheint der alert nur, wenn ich auf "weiter" klicke (macht ja auch Sinn). Gibt es eine JS Version davon, die ein alert "live" an den Teilnehmer schickt? Bzw. wie stelle ich das ungefähr an?

1 Answer

0 votes
by SoSci Survey (306k points)
selected by s109993
 
Best answer

Dieser Code wird dann aktiv, wenn der Benuzter die Seite wechselt. Wenn Sie also 5 Seiten haben und nach 5 Minuten (oder hier nach 10 Sekunden) wird Seite 3 erreicht, dann erscheint beim Laden der Seite der Alert.

Kurz zur Erklärung: PHP-Code wird immer zwischen den Seiten aktiv. JavaScript Code läuft bei den Befragten im Browser und kann so auch innerhalb der Seite aktiv werden.

Was SIe vermutlich haben möchten, wäre das hier:

if (!isset($timeout)) {
  $timeout = strtotime('+10 seconds');  // zu Test zwecken 
  registerVariable($timeout);
}
$timeLeft = $timeout - time();
replace('%time%', $timeLeft);

html('
<script type="text/javascript">
window.setTimeout(function() {
  alert("I am an alert box!");
}, 1000 * %time%);
</script>
');

Was passiert da? Der PHP-Code schaut, wie viel Zeit noch verfügbar ist und speichert das in den Platzhalter %time%.

Und das html() bindet den JavaScript-Code ein, welcher dann window.setTimeout() aufruft. Das startet den Timer innerhalb der Seite. Und nach Ablauf der Zeit (1000-mal das was wir vorhin als verbleibende Zeit definiert haben, weil diese Funktion Millisekunden erwartet) wird die Funktion aufgerufen, die innerhalb von window.setTimeout() definiert wird. Das ist ziemlich verschachtelt und daher nicht ganz einfach zu lesen. Man könnte es auch so schreiben:

html('
<script type="text/javascript">
function showAlert() {
  alert("I am an alert box!");
}
window.setTimeout(showAlert, 1000 * %time%);
</script>
');
by s109993 (10.3k points)
edited by s109993
Guten Morgen,
vielen Dank für die sehr ausführliche Antwort. Leider schaffe ich es gerade nicht den alert zu triggern. Deshalb zur Sicherheit die Nachfrage: Der PHP Teil muss nur auf der 1. Seite des Countdowns sein und der html('') Teil auf jeder Seite? Oder der ganze Code auf jeder Seite? Da PHP mit isset versehen ist, sollte das doch auch kein problem sein, oder?

Edit: Die Console meldet unexpected Token '%'
Edit2: Fehler gefunden, beim 2. Platzhalter fehlt ein %
by SoSci Survey (306k points)
Dieser PHP-Code muss auf jede Seite:

$timeLeft = $timeout - time();
replace('%time%', $timeLeft);

Sie müssen ja zu Beginn der Seite immer angeben, wie viel Zeit noch übrig ist.

Und im JS-Code fehlte noch ein Prozent-Zeichen nach dem %time%, das habe ich oben nun korrigiert.

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

...