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

0 votes

Guten Morgen,

Ich habe für meinen Fragebogen mit JavaScript 4 ineinander verschachtelte Fragen erstellt, welche wie in Fragen bei Auswahl einer bestimmten Option sofort einblenden selektiv eingeblendet werden:

  • bei Auswahl von "Ich behandle selbst" der Frage BS03 erscheint Frage BS02
  • bei Auswahl von "Überweisung an Kollegen" der Frage BS03 erscheint Frage UE01
  • bei Auswahl von "Psychotherapie" der Frage BS02 erscheint Frag PS03

Dazu habe ich folgendes JavaScript als Textbaustein "Adaptiver Filter" programmiert:

<script type="text/javascript">
<!--

var optionA = document.getElementById("BS03_011");  // HTML-ID "Tagesschläfrigkeit - Ich behandle selbst"
var optionB = document.getElementById("BS03_021");  // HTML-ID "Atmungsstörung- Ich behandle selbst"
var optionC = document.getElementById("BS03_031");  // HTML-ID "Einschlafstörung- Ich behandle selbst"
var optionD = document.getElementById("BS03_041");  // HTML-ID "Parasomnie- Ich behandle selbst"
var optionE = document.getElementById("BS03_051");  // HTML-ID "Zirkadiane Rhythmusstörung- Ich behandle selbst"
var optionF = document.getElementById("BS03_061");  // HTML-ID "Narkolepsie- Ich behandle selbst"
var optionG = document.getElementById("BS03_071");  // HTML-ID "RLS- Ich behandle selbst"
var optionH = document.getElementById("BS03_081");  // HTML-ID "Hypersomnie- Ich behandle selbst"
var optionI = document.getElementById("BS03_091");  // HTML-ID "Sonstige- Ich behandle selbst"
var frage = document.getElementById("BS02_qst");  // HTML-ID der Frage "Behandlungsverfahren"
 
var optionJ = document.getElementById("BS03_012");  // HTML-ID "Tagesschläfrigkeit- Überweisung"
var optionK = document.getElementById("BS03_022");  // HTML-ID "Atmungsstörung-Überweisung"
var optionL = document.getElementById("BS03_032");  // HTML-ID "Einschlafstörung- Überweisung"
var optionM = document.getElementById("BS03_042");  // HTML-ID "Parasomnie- Überweisung"
var optionN = document.getElementById("BS03_052");  // HTML-ID "Zirkadiane Rhythmusstörung- Überweisung"
var optionO = document.getElementById("BS03_062");  // HTML-ID "Narkolepsie-Überweisung"
var optionP= document.getElementById("BS03_072");  // HTML-ID "RLS- Überweisung"
var optionQ = document.getElementById("BS03_082");  // HTML-ID "Hypersomnie-Überweisung"
var optionR = document.getElementById("BS03_092");  // HTML-ID "Sonstige- Überweisung"
var fraegle = document.getElementById("UE01_qst");  // HTML-ID der Frage "Zufriedenheit Überweisungsmöglichkeiten"

var optionA1 = document.getElementById("BS02_013");  // HTML-ID "Tagesschläfrigkeit - Psychotherapie"
var optionB1 = document.getElementById("BS02_023");  // HTML-ID "Atmungsstörung- Psychotherapie"
var optionC1 = document.getElementById("BS02_033");  // HTML-ID "Einschlafstörung- Psychotherapie"
var optionD1 = document.getElementById("BS02_043");  // HTML-ID "Parasomnie- Psychotherapie"
var optionE1 = document.getElementById("BS02_053");  // HTML-ID "Zirkadiane Rhythmusstörung- Psychotherapie"
var optionF1 = document.getElementById("BS02_063");  // HTML-ID "Narkolepsie- Psychotherapie"
var optionG1 = document.getElementById("BS02_073");  // HTML-ID "RLS- Psychotherapie"
var optionH1 = document.getElementById("BS02_083");  // HTML-ID "Hypersomnie- Psychotherapie"
var optionI1 = document.getElementById("BS02_093");  // HTML-ID "Sonstige- Psychotherapie"
var frage1 = document.getElementById("PS03_qst");  // HTML-ID der Frage "Duplikat Verfahren Psychotherapie"


function toogle() {
  // Die Funktion prüft, ob eine der Optionen ausgewählt wurde ausgewählt wurde
  if (optionA.checked || optionB.checked || optionC.checked || optionD.checked || optionE.checked || optionF.checked || optionG.checked || optionH.checked || optionI.checked) {
    // Wurde eine Option ausgewählt, dann wird die Frage angezeigt
    // Keine Angabe ("") verwendet die Standard-Einstellung (normal anzeigen)
    frage.style.display = "";
  } else {
    // Mit der Anzeigeoption "none" wird die Frage ausgeblendet
    frage.style.display = "none";
}
  if (optionJ.checked || optionK.checked || optionL.checked || optionM.checked || optionN.checked || optionO.checked || optionP.checked || optionQ.checked || optionR.checked) {
    // Wurde eine Option ausgewählt, dann wird die Frage angezeigt
    // Keine Angabe ("") verwendet die Standard-Einstellung (normal anzeigen)
    fraegle.style.display = "";
  } else {
    // Mit der Anzeigeoption "none" wird die Frage ausgeblendet
    fraegle.style.display = "none";
  }
  if (optionA1.checked || optionB1.checked || optionC1.checked || optionD1.checked || optionE1.checked || optionF1.checked || optionG1.checked || optionH1.checked || optionI1.checked) {
    // Wurde eine Option ausgewählt, dann wird die Frage angezeigt
    // Keine Angabe ("") verwendet die Standard-Einstellung (normal anzeigen)
    frage1.style.display = "";
  } else {
    // Mit der Anzeigeoption "none" wird die Frage ausgeblendet
    frage1.style.display = "none";
  }
}
 
// Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird
SoSciTools.attachEvent(optionA, "click", toogle);
SoSciTools.attachEvent(optionB, "click", toogle);
SoSciTools.attachEvent(optionC, "click", toogle);
SoSciTools.attachEvent(optionD, "click", toogle);
SoSciTools.attachEvent(optionE, "click", toogle);
SoSciTools.attachEvent(optionF, "click", toogle);
SoSciTools.attachEvent(optionG, "click", toogle);
SoSciTools.attachEvent(optionH, "click", toogle);
SoSciTools.attachEvent(optionI, "click", toogle);
SoSciTools.attachEvent(optionJ, "click", toogle);
SoSciTools.attachEvent(optionK, "click", toogle);
SoSciTools.attachEvent(optionL, "click", toogle);
SoSciTools.attachEvent(optionM, "click", toogle);
SoSciTools.attachEvent(optionN, "click", toogle);
SoSciTools.attachEvent(optionO, "click", toogle);
SoSciTools.attachEvent(optionP, "click", toogle);
SoSciTools.attachEvent(optionQ, "click", toogle);
SoSciTools.attachEvent(optionR, "click", toogle);
SoSciTools.attachEvent(optionA1, "click", toogle);
SoSciTools.attachEvent(optionB1, "click", toogle);
SoSciTools.attachEvent(optionC1, "click", toogle);
SoSciTools.attachEvent(optionD1, "click", toogle);
SoSciTools.attachEvent(optionE1, "click", toogle);
SoSciTools.attachEvent(optionF1, "click", toogle);
SoSciTools.attachEvent(optionG1, "click", toogle);
SoSciTools.attachEvent(optionH1, "click", toogle);
SoSciTools.attachEvent(optionI1, "click", toogle);
 
// Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist
// (z.B. ausblenden der Texteingabe zu Beginn)
toogle();


// -->
</script>

Dies funktioniert tadellos.


Nun möchte ich gerne, wie in Items in eine andere Frage übernehmen beschrieben, in den Folgefragen nur jene Items anzeigen lassen, welche in der Frage zuvor ausgewählt wurden.
Dazu muss ich vermutlich Eigene Formularelemente verwenden. Dafür habe ich bereits 3 Interne Variablen mit je 9 Items erstellt:

  • IV01 Interne Variable Psychotherapie
  • IV02 Interne Variable Ich behandle selbst
  • IV03 Interne Variable Überweisung

Diese Variablen würde ich auf S. 10 des Fragebogens einfügen - ziehe ich diese über oder unter die Frage, in welcher die interne Variable erfasst werden soll?

Anschließend erfolgt das Programmieren der Internen Variablen in meinem JavaScript "Adaptiver Filter". Zuletzt würde ich die PHP-Filter programmieren, um Items in eine andere Frage zu übernehmen.

Ist mein Gedankengang korrekt oder habe ich bei der Kombination von JavaScript und PHP einen Denkfehler gemacht? Wie sieht eine bessere Lösungsmöglichkeit aus?

Hier der Pretest-Link: https://www.soscisurvey.de/test275480/?act=yCM93yKItuBpp2dgGr7nkDZh

Vielen Dank im Voraus!

closed with the note: Programmieren mit PHP-Filter ist sinnvoller
in SoSci Survey (dt.) by s191043 (140 points)
closed by s191043

1 Answer

0 votes

Ich habe für meinen Fragebogen mit JavaScript 4 ineinander verschachtelte Fragen erstellt

Das ist aus künstlerischer Perspektive durchaus bemerkenswert ... aber ich bin nicht sicher, ob es den Befragten und einer übersichtlichen Bedienung wirklich entgegenkommt. Womöglich wäre es sinnvoller und übersichtlicher, mit klassischen Filtern zu arbeiten und die Folgefragen auf nachfolgenden Seiten anzuzeigen.

Nun möchte ich gerne, wie in Items in eine andere Frage übernehmen beschrieben, in den Folgefragen nur jene Items anzeigen lassen, welche in der Frage zuvor ausgewählt wurden.

In welcher der vielen Fragen denn? Also im Prinzip können Sie auch die Optionen aus allen Teilfragen sammeln, dann müssen Sie aber die Item-Nummern umkodieren. Beispiel:

Frage 1 hat 10 Items, davon sind Nr. 2 und 4 ausgewählt.

Frage 2 hat ebenfalls 10 Items, davon sind Nr. 3 und 7 ausgewählt.

Wenn eine nachfolgende Frage nun 20 Items hat (zweimal 10), dann müssen die Items von Frage 2 auf die Items 11 bis 20 abgebildet werden. Wie macht man das praktisch? Man nimmt die Liste ausgewählter Items aus Frage 2 und addiert jeweils 10 hinzu, bevor man Sie in die Liste der Items schreibt, die in der Folgefrage angezeigt werden sollen.

Nachdem Sie da ein recht komplexes Design haben und ich nicht ganz sicher bin, was Sie damit bezwecken, würde ich vorschlagen, Sie picken erstmal zwei Fragen heraus und wir sehen uns das dann konkret (gerne mit Item IDs) an.

Interne Variablen brauchen Sie evtl. gar nicht.

by SoSci Survey (245k points)
Vielen Dank schonmal! Die klassischen Filter habe ich bereits als Alternativoption im Hinterkopf, falls das direkte Anzeigen der Fragen nicht klappen oder in tiefere programmiertechnische Dimensionen abtauchen sollte.


Meine Idee war folgende: Wenn bei Frage BS03 "Ich behandle selbst" angekreuzt wurde, ploppt sofort Frage BS02 auf. BS02 enthält nur die Items, bei welchen zuvor in BS03 "Ich behandle selbst" angekreuzt wurde.
Ich bemerke aber gerade das Problem an meiner Idee: Wenn bei BS03 Item 1 "Ich behandle selbst" angekreuzt wurde, kann BS02 nur mit Item 1 erscheinen (da der Proband für die restlichen Items in BS03 noch nichts ausgewählt hat). Somit müsste für jeden weiteren Klick auf "Ich behandle selbst" ein weiteres einzelnes Item in BS02 erscheinen und sich die komplette BS02 Frage erst nach und nach aufbauen. Das wäre in der Tat für die Übersichtlichkeit des Fragebogens hinderlich.
Ich vermute daher, dass, wie von Ihnen bereits angesprochen, der Erstellung einer Liste (Array) in JavaScript der Vorzug gegeben werden sollte?

Die "Ich behandle selbst-Antwortoptionen" haben die HTML-IDs: BS03_011, BS03_021, BS03_031, BS03_041, BS03_051, BS03_061, BS03_071, BS03_081, BS03_091

Die Items haben die HTML-IDs: BS03_01_label, BS03_02_label, BS03_03_label, BS03_04_label, BS03_05_label, BS03_06_label, BS03_07_label, BS03_08_label, BS03_09_label

Die Items mit der Antwortoption "Ich behandle selbst" haben die Kennung: BS03_01_1, BS03_02_1, BS03_03_1, BS03_04_1, BS03_05_1, BS03_06_1, BS03_07_1, BS03_08_1, BS03_09_1

https://www.soscisurvey.de/test275480/?act=yCM93yKItuBpp2dgGr7nkDZh
> Ich vermute daher, dass, wie von Ihnen bereits angesprochen, der Erstellung einer Liste (Array) in JavaScript der Vorzug gegeben werden sollte?

Eigentlich spricht Ihre Beschreibung dafür, dass die Verteilung auf mehrere Seiten (via PHP-Code) wohl die übersichtlichste Lösung wäre ;)
...