0 votes
in SoSci Survey (dt.) by s081613 (575 points)
edited by SoSci Survey

Hallo zusammen,
ich hoffe ihr könnt mir bei folgendem Problem helfen. Mein Fragebogen ist mittlerweile recht komplex. Ich möchte folgendes erreichen:

Zwei Fragen sollen ausgeblendet werden, wenn die Person zuvor auf der selben Seite bestimmte Angaben gemacht hat: Der Teilnehmer hat entweder die Möglichkeit (1) eine Texteingabe in einem Freifeld zu machen, (2) in einer anderen Frage eine Dropdown-Auswahl zu treffen oder (3) bei zwei Fragen eine bestimmte Kombination anzukreuzen. Jeder dieser drei Bedingungen soll im Anschluss dazu führen das eine weiter unten stehende Variable ausgeblendet wird, weil Sie nicht mehr zutreffend ist. Verkompliziert wird die Bedingung dadurch, dass zwar immer (3) auf der Seite angezeigt wird, jedoch entweder nur Frage (1) oder (2), abhängig vom Antwortverhalten auf einer vorherigen Seite.

Fragen (1) und (2) fragen das gleiche "Item" ab, ich kann jedoch abhängig von den Angaben auf den vorausgegangenen Seiten einigen Teilnehmern eine Vorauswahl an Antworten präsentieren, die restlichen Teilnehmer können die Frage mit einem Freitext beantworten.

Dazu kann man in JavaScript die Event Handler programmieren. Folgender Code löst aber keine Ausführung aus:


var dropdown = document.getElementById("BT25");  // Das Eingabefeld der Frage BT25
var textfeld = document.getElementById("BT06_01");  // offene Texteingabe anderer Inhalt
var optionMA = document.getElementById("BT08_01a");  // Option "JA"
var optionMB = document.getElementById("BT08_02a");  // Option "Nein"
var optionNA = document.getElementById("BT26_01a");  // Option "JA"
var optionNB = document.getElementById("BT26_02a");  // Option "Nein"
var frage1 = document.getElementById("BT26_qst");  // Die Frage BT26, die ein-/auszublenden ist
var frage2 = document.getElementById("BT07_qst");  // Die Frage BT07, die ein-/auszublenden ist
 
function toogleText() {
if (textfeld.value.replace(/\s/g, "") != "") {
    // Wurde das Textfeld ausgefüllt, dann werden die Fragen ausgeblendet
    frage1.style.display = "none";
    frage2.style.display = "none";
  } else {
    frage1.style.display = "";
    frage2.style.display = "";
  }
}

// Die Funktion soll jedesmal ausgeführt werden, wenn das Textfeld ausgefüllt wird
SoSciTools.attachEvent(textfeld, "keyup", toogleText);
// Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist
toogleText();

function toogle1() {
  if (optionMA.checked)  {
    frage1.style.display = "none";
    frage2.style.display = "none";
  } else if ((optionMB.checked) && (optionNB.checked)) {
    frage2.style.display = "none";
 } else {
    frage1.style.display = "";
    frage2.style.display = "";
 }
}

// Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird
SoSciTools.attachEvent(optionMA, "click", toogle1);
SoSciTools.attachEvent(optionMB, "click", toogle1);
SoSciTools.attachEvent(optionNA, "click", toogle1);
SoSciTools.attachEvent(optionNB, "click", toogle1);
toogle1();

function toogle2() {
  if <span class="S2Tooltip anchor marker">dropdown.value != "-9") </span><span class="S2Tooltip container"><span class="S2Tooltip tiptext rounded shadow">| (dropdown.value != "68"</span></span>  {  // Hier den Wert (Antwortcode) eintragen, bei dem das zweite Dropdown ausgeblendet werden soll. Keine Angabe ("") verwendet die Standard-Einstellung (normal anzeigen)
    frage1.style.display = "none";
    frage2.style.display = "none";
  } else {
    frage1.style.display = "";
    frage2.style.display = "";
  }
}

SoSciTools.attachEvent(dropdown, "change", toogle2); 
SoSciTools.attachEvent(dropdown, "click", toogle2);  
toogle2();

Jeder Event Handler für sich alleine funktioniert ohne Probleme. Nur wenn man toogleText() und toogle1() kombinieren möchte treten Probleme auf. Alle anderen Kombinationen funktionieren (habe ich bereits geprüft).

In der Console wird folgender Fehler angezeigt:
1. "Uncaught SyntaxError: Unexpected token <"
2. "check for duplicates: insertTimeout"

Fehler 1 taucht immer auf, unabhängig von der angezeigten Frage (1) oder (2). Der zweite Fehler taucht nur auf, wenn Frage (1) sichtbar ist.

Ich bedanke mich schon mal für eure Hilfe!!!

P.S.: Ich habe gesehen, dass andere Nutzer des Supprt Forums es hinbekommen haben, dass der gesamte Code in einem separaten Fenster angezeigt wird. Könntet ihr mir in eurer Antwort auch kurz mitteilen, wie das geht. Das erleichtert ggf. zukünftige Fragen. Danke!

3 Answers

+1 vote
by SoSci Survey (328k points)
selected by s081613
 
Best answer

Zum Verständnis des folgenden Codes empfehle ich folgende Lektüre:
Mehrere Bedingungen verknüpfen

Sie benötigen eine Funktion, die beide Bedingungen abbprüft - und die zugleich überprüft, ob die jeweilige Frage überhaupt vorhanden ist. Prinzipiell sollte zwar auch Ihre Kombination funktionieren, weil nur die eine oder die andere Funktion ausgelöst wird. Aber folgendes ist ordentlicher:

function toogle() {
  if (
    (dropdown && (dropdown.value != -9)) ||
    (textfeld && (textfeld.value.replace(/\s/g, "") != ""))
  ) {
      frage.style.display = "none";
  } else {
      frage.style.display = "";
  }
}

if (dropdown) SoSciTools.attachEvent(dropdown, "change", toogle); 
if (dropdown) SoSciTools.attachEvent(dropdown, "click", toogle);  
if (textfeld) SoSciTools.attachEvent(textfeld, "keyup", toogle);
toogle();
0 votes
by SoSci Survey (328k points)

Ich habe Ihren Code mit dem Knopf {} einmal als Code formatiert.

In der ersten Zeile von toogle2() steht bei Ihnen

<span class="S2Tooltip anchor marker">dropdown.value != "-9")

Steht das so in Ihrem HTML-Code? Dann ist das einfach zu ändern.

Oder wird das erst bei der Ausgabe im Fragebogen geändert? Dann stammt das Problem daher, dass SoSci Survey die Klammer hier falsch interpretiert. Lassen Sie zwischen den ersten beiden Klammern in diesem Fall doch bitte einmal ein Leerzeichen.

by s081613 (575 points)
edited by s081613
Erstmal vielen Dank für die schnelle Antwort; ich bin immer wieder beeindruckt wie schnell der Support funktioniert.
Beim Kopieren des Codes scheint mir ein Fehler unterlaufen zu sein. Die erste Zeile von toogle2() lautet

  if (dropdown.value != "-9")


Ich verstehe nicht wo das Leerzeichen eingefügt werden muss. Der Handler  toogle2() funktioniert wenn er alleine ausgeführt wird. Nur in Kombination mit toogletext() wird kein Befehl ausgeführt.
Ausschließlich folgende Kombination bereitet Probleme:

var dropdown = document.getElementById("BT25");  // Das Eingabefeld der Frage BT25
var textfeld = document.getElementById("BT06_01");  // offene Texteingabe anderer Inhalt
var frage1 = document.getElementById("BT26_qst");  // Die Frage BT26, die ein-/auszublenden ist
var frage2 = document.getElementById("BT07_qst");  // Die Frage BT07, die ein-/auszublenden ist
 
function toogleText() {
if (textfeld.value.replace(/\s/g, "") != "") {
    // Wurde das Textfeld ausgefüllt, dann werden die Fragen ausgeblendet
    frage1.style.display = "none";
    frage2.style.display = "none";
  } else {
    frage1.style.display = "";
    frage2.style.display = "";
  }
}

// Die Funktion soll jedesmal ausgeführt werden, wenn das Textfeld ausgefüllt wird
SoSciTools.attachEvent(textfeld, "keyup", toogleText);
// Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist
toogleText();

function toogle2() {
  if ( dropdown.value != "-9" )  
    frage1.style.display = "none";
    frage2.style.display = "none";
  } else {
    frage1.style.display = "";
    frage2.style.display = "";
  }
}

SoSciTools.attachEvent(dropdown, "change", toogle2);
SoSciTools.attachEvent(dropdown, "click", toogle2);  
toogle2();



Meine Vermutung ist, dass die für die Bedingungen erforderlichen Fragen BT25 und BT06 beide auf der Seite gleichzeitig angezeigt werden müssen, damit javascript funktioniert. Wie in meinem ursprünglichen Fragetext bereits geschrieben werden die beiden Fragen aber alternativ angezeigt, d.h. wenn auf der Seite zuvor eine entsprechende Auswahl getätigt wurde, wird nur BT25 angezeigt, falls eine andere Wahl getroffen wurde BT06.

Bitte entschuldigen Sie die Extra-Runde. Ich kann immer noch kein Codefenster erstellen. Mir wird bei ihrer Antwort der "Knopf {}" angezeigt. Der ist mir nicht bekannt (Sorry, für die dumme Frage am Ende)
by SoSci Survey (328k points)
Der Knopf {} wird nur angezeigt, wenn Sie eine Frage schreiben/ändern, nicht bei den Kommentaren zur Frage :)

> Meine Vermutung ist, dass die für die Bedingungen erforderlichen Fragen BT25 und BT06 beide auf der Seite gleichzeitig angezeigt werden müssen, damit javascript funktioniert.

Ihre beiden Funktionen blenden - das sehe ich jetzt erst - die gleichen zwei Fragen ein oder aus. Das heißt: toogleText() kann die Fragen schon einblenden, aber toogle2() blendet sie dann eben wieder aus.

Und hinzu kommt der Punkt, dass das JavaScript nur auf Antworten der aktuellen Seite zugreifen kann.

Ich schlage folgende Lösung vor: Schrieben Sie ein <div id="block"> per HTML-Code in den Fragebogen. Darunter sorgen Sie mittels PHP-Code dafür, dass die richtige Frage angezeigt wird. Und darunter schrieben Sie nochmal ein </div>.

Jetzt brauchen Sie nur noch das JavaScript, welches die Frage abhängig von der Antwort auf der aktuellen Seite ein-/ausblendet. Und dieses blendet jetzt aber nicht mehr die Frage aus, sondern das <div>. Also

var block = document.getElementById("block");

Und dann im JavaScript entsprechend

block.style.display = "none";
by s081613 (575 points)
Hi. Ich habe meine Frage abgeändert und als Antwort angefügt. Ich weiß nicht ob euch dies angezeigt wird. Ich wollte die Ursprungsfrage nicht abändern weil dann die bisherigen Antworten keinen Sinn ergeben würden.

Gibt es für solche Fälle einen Verhaltenscodex unter Mitgliedern des Supportforums? Wäre es besser gewesen die Ausgangsfrage zu editieren?
+1 vote
by s081613 (575 points)

Bevor ich einen neuen Kommentar schreibe würde ich die Ausgangsfrage gerne wie folgt abändern, da diese von mir ungenau gestellt wurde und um die Strukturen im Fragebogen besser abzubilden. Nicht Elemente 2 und 3 sollen ausgeblendet werden, sondern abhängig von den Antworten in diesen Elementen soll ggf. Element 4 ausgeblendet werden. Vielen Dank für eure Geduld und die bisherige Unterstützung von euch. Mittlerweile habe ich auch den Knopf{} gefunden ;)

Hallo zusammen,
ich hoffe ihr könnt mir bei folgendem Problem helfen. Mein Fragebogen ist mittlerweile recht komplex. Ich möchte folgendes erreichen:

Auf Seite 1 werden die Teilnehmer nach ihren Arbeitgeber befragt (Element1).

Auf Seite zwei frage ich nach der Bezeichnung der Hierarchiestufe (Ausbildungsplätze ausgenommen), auf der sich der Teilnehmer in seinem Unternehmen befindet:
Die mir bekannte Stufen einiger Unternehmen habe ich bereits alle in einer Variable (Element 2) abgelegt und blende diese entsprechend der Angabe auf Seite 1 ein oder aus. Bei manchen Arbeitgebern kenne ich die Bezeichnungen jedoch nicht, weswegen ich dann statt der Dropdown Auswahl ein Freifeld (Element 3) einblende, in das die Teilnehmer ihre Stufe eintragen können (wieder Ausbildungsplätze ausgenommen). Hierzu der PHP-Code (vereinfachte Darstellung). Der Code funktioniert fehlerfrei und soll hier dazu dienen den Fragebogenverlauf und dessen Struktur deutlich zu machen:

if (value('Element1') == 1) {
  question('Element2', '20-24,68');  
} else if (value('Element1') == 2) {
  question('Element2', '1-11,68');  
} else if (value('Element1') == 96) {
  question('Element2', '43-51,68'); 
} else if (value('Element1') == 3) {
  question('Element2', '34-42,68');
} else if (value('Element1') == 4) {
  question('Element2', '12-19,68');
} else if (value('Element1') == 5) {
  question('Element2', '26-33,68');
} else if (value('Element1') == 6)  {
  question('Element2', '52-58,68');
} else {
question('Element3');
}

Element 4 auf Seite 2 stellt eine Frage zu Ausbildungsplätzen. Folglich ist die Frage für alle Teilnehmer, die zuvor (in Element 2 oder 3) angegeben haben auf einer höheren Stufe angestellt zu sein, irrelevant und soll entsprechend ausgeblendet werden.

Da sich das Element 4 auf der gleichen Seite befindet wie Element 2 oder Element 3, muss man in JavaScript einen Event Handler programmieren. Das habe ich wie folgt versucht:

var dropdown = document.getElementById("Element2"); 
var textfeld = document.getElementById("Element3");
var frage = document.getElementById("Element4"); 

function toogle() {
  if ( dropdown.value != "-9" ) {
    frage.style.display = "none";
  } else {
    frage.style.display = "";
  }
}

SoSciTools.attachEvent(dropdown, "change", toogle); 
SoSciTools.attachEvent(dropdown, "click", toogle);  
toogle();
 
function toogleText() {
if (textfeld.value.replace(/\s/g, "") != "") {
    frage.style.display = "none";
  } else {
    frage.style.display = "";
  }
}

SoSciTools.attachEvent(textfeld, "keyup", toogleText);
toogleText();

Der Handler toogle() funktioniert wenn er alleine ausgeführt wird. Umgekehrt funktioniert auch toogletext() ohne toogle(). Nur in Kombination wird kein Befehl ausgeführt.

In der Console wird folgender Fehler angezeigt:
1. "Uncaught SyntaxError: Unexpected token <"
2. "check for duplicates: insertTimeout"

Fehler 1 taucht immer auf, unabhängig vom angezeigten Element (Element 2 oder 3). Der zweite Fehler taucht nur auf, wenn Element 3 sichtbar ist.

Meine Vermutung ist, dass die für die Bedingungen erforderlichen Elemente 2 und Element 3 beide gleichzeitig auf Seite 2 angezeigt werden müssen, damit javascript funktioniert und Element 4 ggf. ausblendet.

Ich bedanke mich schon mal für eure Hilfe!!!

by SoSci Survey (328k points)
Tipp: Es gibt die Funktion "ask related question", dann bekommt man eine ganz frische Frage und die Antworten rutschen nicht alle durcheinander :)
by SoSci Survey (328k points)
Zu diesem Fehler ....

"Uncaught SyntaxError: Unexpected token <"

posten Sie bitte noch, auf welche Zeile sich dieser Fehler bezieht.

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

...