0 votes
in SoSci Survey (dt.) by s245087 (185 points)

Hallo,

ich versuche, eine Lesestudie mit Experience Sampling zu implementieren. Die VP lesen in dieser Studie einen auf mehrere Seiten aufgeteilten Text. Zusätzlich werden die VP während des Lesens im Abstand von 2-3 Minuten durch eine Gedankenprobe (thought probe) unterbrochen, die nach bestimmten Charakteristika der Gedanken der VP während des Lesens fragt.

Dafür würde ich gerne eine Multilevelstruktur plus Timer benutzen. Der Ablauf soll grob wie folgt sein:

1) Initialisiere einen Timer.
2) Ist der Timer abgelaufen, springe in einen untergeordneten Fragebogen.
3) Ist die VP mit dem untergeordneten Fragebogen fertig, dann springe zurück auf die Seite, bei der die VP beim Lesen unterbrochen wurde und initialisiere einen neuen Timer.

Ich habe mich beim Timer an den JS-Beispielen auf der Homepage orientiert und das funktioniert auch, d.h. nach Timer-Ablauf passiert etwas (der Alert wird angezeigt). Nur finden die Sprünge nicht so statt, wie gewünscht. Hier ist mein Minimalbeispiel.

PREP (dient nur zum Registrieren der Variablen)

$timeout = -999;
registerVariable($timeout);
$lastpage = "";
registerVariable($lastpage);
goToPage('BACK');

DOWN (dient nur zum Springen in den untergeordneten Fragebogen)

multiLevelDown('LES-PRB');

BACK (dient zum Rücksprung auf die letzte Seite und der Neuinitialisierung des Timers)

// randomInterval() verwendet mt_rand()
$timeout = strtotime('+'.randomInterval().' seconds');
goToPage($lastpage);

Seite A (B und C sind bis auf den Inhalt von $lastpage identisch)

// Auf welcher Seite bin ich?
$lastpage = 'Seite A';

// Wenn Timer abgelaufen, springe zu Seite DOWN
if(time() >= $timeout){
    goToPage('DOWN');
}
// Zeig dem User an, auf welcher Seite du bist
html(''.$lastpage);

// Zeige Textelement mit JS-Code an (wie im Beispiel "Timer")
show('L124', array('%timeleft%' => ($timeout - time())));

Das Textelement für den Timer ist wie folgt:

<script type="text/javascript">

// Verbleibende Zeit initialisieren
var timeLeft = %timeleft%;
var timeStart = new Date();
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);
       SoSciTools.submitPage();
   }
}

// Initialisierung
var timerInterval = window.setInterval(updateCountdown, 1000);
updateCountdown();

</script>

Wenn ich z.B. auf Seite A bleibe und warte, dann wird nach Ablauf des Timers in den untergeordneten Fragebogen gesprungen. Danach geht es aber auf Seite B zurück, obwohl ich erwartet hätte, dass es zuerst nach BACK und von dort nach Seite A gehen müsste. Der Inhalt der Variablen $lastpage ist aber auch überraschenderweise "Seite B" (analog auf Seite B ist es "Seite C") und im Debug-Modus, wenn man sich im untergeordneten Fragebogen befindet, wird auch Seite B als vorhergehende Seite angezeigt. Warum passiert das und wie kann man das lösen?

1 Answer

0 votes
by SoSci Survey (327k points)

JavaqScript kann mit dem Fragebogen nur begrenzt interagieren: Es kann den Weiter-Knopf drücken (SoSciTools.submitPage()) oder selbigen blockieren.

In Ihrem Fall würde ich folgendes versuchen: Bauen Sie in die Seite einen Knopf mittels multiLeveButton() ein. Anders als multiLevelDown() kommen sie da im Anschluss wieder auf dieselbe Seite wie vorher, nicht auf die nächste.

Zudem kann das JavaScript Sie in eine interne Variable schreiben, ob schon ein Sprung erfolgte, vgl. Interne Variablen und PHP-Code. Das können Sie dann in einem PHP-Filter auf der Seite als Information nutzen, um das weitere Procedere zu steuern.

Mit dem zusätzlich eingefügten Knopf können Sie nun zwei Dinge tun: (1) Sie können ihn via JavaScript klicken und (2) Sie können ihn in ein <div style="position: absolute; left: -2000px;"> packen, sodass ihn niemand sieht. Zweiteres aber erst, wenn alles korrekt funktioniert.

Warum passiert das

Um diese Frage zu beantworten, sehen Sie sich bitte die Debug-Information an. Und posten sie diese auch gerne, wenn Sie das Verhalten nicht nachvollziehen können.

by s245087 (185 points)
Kleiner Nachtrag für diejenigen, die ein ähnliches Problem haben. Der Code war eigentlich fast korrekt, d.h. vom Prinzip her funktionierte es eigentlich, so wie gedacht (auch ohne zusätzlichen Knopf). Das Problem war, dass der Teil

if(time() >= $timeout){
    goToPage('DOWN');
}

nicht ganz oben im Code stand (das $lastpage =... war der Übeltäter). Dadurch fanden Rücksprünge auf die falsche Seite statt. Das zu beheben brachte das gewünschte Ergebnis.

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

...