Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
de:create:dynamic [16.12.2020 19:14] – Korrektur admin | de:create:dynamic [13.09.2023 13:33] – [Grundwissen] schimke.tu-berlin | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
Prinzipiell sind mit JavaScript und dem Document Object Model (DOM) sehr umfassende Modifikationen innerhalb einer Fragebogenseite möglich, allerdings erfordert dies mitunter fortgeschrittene Programmier-Kenntnisse. Diese Anleitung beschränkt sich darauf, wie man damit eine Frage in Abhängigkeit einer Antwort ein- bzw. ausblendet. | Prinzipiell sind mit JavaScript und dem Document Object Model (DOM) sehr umfassende Modifikationen innerhalb einer Fragebogenseite möglich, allerdings erfordert dies mitunter fortgeschrittene Programmier-Kenntnisse. Diese Anleitung beschränkt sich darauf, wie man damit eine Frage in Abhängigkeit einer Antwort ein- bzw. ausblendet. | ||
+ | **Tipp:** Falls der JavaScript-Code nicht auf Anhieb funktioniert, | ||
===== Grundwissen ===== | ===== Grundwissen ===== | ||
- | - In JavaScript gibt es so genannte //Event Handler//. Das sind Funktionen, die ausgeführt werden, wenn der Benutzer irgend etwas auf der Seite macht -- wenn also Ereignisse | + | - In JavaScript gibt es so genannte //Event Handler//. Das sind Funktionen, die ausgeführt werden, wenn der Benutzer irgend etwas auf der Seite macht -- wenn also (// |
- Jedes Element einer (HTML-)Internetseite hat eine ganze Reihe von Eigenschaften. SoSci Survey erstellt die einzelne Fragebogen-Seite als HTML-Seite -- und alle Fragen und Eingabefelder sind ihrerseits HTML-Elemente, | - Jedes Element einer (HTML-)Internetseite hat eine ganze Reihe von Eigenschaften. SoSci Survey erstellt die einzelne Fragebogen-Seite als HTML-Seite -- und alle Fragen und Eingabefelder sind ihrerseits HTML-Elemente, | ||
- Die Elemente einer HTML-Seite lassen sich am einfachsten anhand ihrer HTML-ID ansprechen. SoSci Survey vergibt für alle Eingabefelder automatisch HTML IDs, die sich an der Frage- bzw. Itemkennung orientieren. | - Die Elemente einer HTML-Seite lassen sich am einfachsten anhand ihrer HTML-ID ansprechen. SoSci Survey vergibt für alle Eingabefelder automatisch HTML IDs, die sich an der Frage- bzw. Itemkennung orientieren. | ||
- | * Am einfachsten ermitteln Sie die ID eines Elements mit den " | + | * Am einfachsten ermitteln Sie die ID eines Elements mit den [[: |
* Für Fragen vergibt SoSci Survey jeweils eine HTML-ID bestehend aus der Frage-Kennung, | * Für Fragen vergibt SoSci Survey jeweils eine HTML-ID bestehend aus der Frage-Kennung, | ||
- In SoSci Survey kann man beliebige Inhalte in eine Fragebogenseite aufnehmen. Also auch JavaScript Code. Dies geschieht am einfachsten, | - In SoSci Survey kann man beliebige Inhalte in eine Fragebogenseite aufnehmen. Also auch JavaScript Code. Dies geschieht am einfachsten, | ||
Zeile 21: | Zeile 22: | ||
**Hinweis: | **Hinweis: | ||
+ | |||
+ | **Hinweis: | ||
**Tipp:** Wenn der Teilnehmer sieht, dass eine der Auswahloptionen mit zusätzlicher Arbeit verbunden ist, dann könnte dies sein Antwortverhalten beeinflussen. Ein klassischer [[filters|Filter]] mit Abfrage der zweiten Frage auf der Folgeseite kann hier sinnvoller sein. | **Tipp:** Wenn der Teilnehmer sieht, dass eine der Auswahloptionen mit zusätzlicher Arbeit verbunden ist, dann könnte dies sein Antwortverhalten beeinflussen. Ein klassischer [[filters|Filter]] mit Abfrage der zweiten Frage auf der Folgeseite kann hier sinnvoller sein. | ||
- | ===== Beispiel | + | ===== Beispiel |
Abhängig von einer Ja/ | Abhängig von einer Ja/ | ||
Zeile 39: | Zeile 42: | ||
var frage = document.getElementById(" | var frage = document.getElementById(" | ||
- | function | + | function |
// Die zwei Pipes (||) sind ein logisches " | // Die zwei Pipes (||) sind ein logisches " | ||
// Die Bedingung prüft also: Ist Option A ausgewählt oder ist B ausgewählt? | // Die Bedingung prüft also: Ist Option A ausgewählt oder ist B ausgewählt? | ||
Zeile 53: | Zeile 56: | ||
// Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird | // Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird | ||
- | SoSciTools.attachEvent(optionA, | + | SoSciTools.attachEvent(optionA, |
- | SoSciTools.attachEvent(optionB, | + | SoSciTools.attachEvent(optionB, |
- | SoSciTools.attachEvent(optionC, | + | SoSciTools.attachEvent(optionC, |
// Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist | // Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist | ||
// (z.B. ausblenden der Texteingabe zu Beginn) | // (z.B. ausblenden der Texteingabe zu Beginn) | ||
- | toogle(); | + | toggle(); |
// --> | // --> | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | ===== Beispiel 1b: Mehrere gleichartige Fragen ===== | ||
+ | |||
+ | Mitunter kommt es vor, dass dieselbe Funktion auf einer Fragebogen-Seite mehrfach zum Einsatz kommt. Wenn wir das vorige Beispiel nehmen: Nehmen wir einmal an, dass auf der Seite nicht nur eine Auswahl mit Zusatzfrage ist, sondern vier Auswahlfragen mit vier Zusatzfragen. | ||
+ | |||
+ | Die naheliegende Lösung wäre es, den JavaScript-Code zu kopieren. Das funktioniert aber nicht ohne weiteres, weil die Variablen ('' | ||
+ | |||
+ | Nachfolgend wird der JavaScript-Code von oben in eine Funktion bzw. Klasse '' | ||
+ | |||
+ | Diese Anleitung lässt das ''< | ||
+ | |||
+ | <code javascript> | ||
+ | function DynamicFilter(auswahlID, | ||
+ | var optionA = document.getElementById(auswahlID | ||
+ | var optionB = document.getElementById(auswahlID | ||
+ | var optionC = document.getElementById(auswahlID | ||
+ | var frage = document.getElementById(frageID + " | ||
+ | |||
+ | function toggle() { | ||
+ | // Die zwei Pipes (||) sind ein logisches " | ||
+ | // Die Bedingung prüft also: Ist Option A ausgewählt oder ist B ausgewählt? | ||
+ | if (optionA.checked || optionB.checked) { | ||
+ | // Wurde " | ||
+ | // Keine Angabe ("" | ||
+ | frage.style.display = ""; | ||
+ | } else { | ||
+ | // Mit der Anzeigeoption " | ||
+ | frage.style.display = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird | ||
+ | SoSciTools.attachEvent(optionA, | ||
+ | SoSciTools.attachEvent(optionB, | ||
+ | SoSciTools.attachEvent(optionC, | ||
+ | |||
+ | // Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist | ||
+ | // (z.B. ausblenden der Texteingabe zu Beginn) | ||
+ | toggle(); | ||
+ | } | ||
+ | |||
+ | |||
+ | // --> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Alles andere bleibt gleich. Nun muss diese Klassen-Funktion noch aufgerufen werden, um eine neue Instanz der Klasse zu initialisieren. Dafür benötigt man das Schlüsselwort '' | ||
+ | |||
+ | < | ||
+ | new DynamicFilter(" | ||
+ | </ | ||
+ | |||
+ | Mit diesem Aufruf zusammen funktioniert der Code wie im vorigen Beispiel. Aber natürlich kann man diese eine Zeil mit weiteren Kennungen mehrfach wiederholen: | ||
+ | |||
+ | < | ||
+ | new DynamicFilter(" | ||
+ | new DynamicFilter(" | ||
+ | new DynamicFilter(" | ||
+ | </ | ||
+ | |||
+ | So lässt sich derselbe Filter sehr übersichtlich mehrfach auf einer Seite verwenden. So einfach funktioniert das natürlich nur dann, wenn alle Filterfragen und Folgefragen dieselbe Struktur haben. Durch das Kapseln in einer Funktion kann man aber generell das Problem umgehen, dass die Variablen unterschiedliche benannt sein müssen. | ||
Zeile 75: | Zeile 139: | ||
var frage = document.getElementById(" | var frage = document.getElementById(" | ||
- | function | + | function |
if (dropdown.value == " | if (dropdown.value == " | ||
frage.style.display = ""; | frage.style.display = ""; | ||
Zeile 83: | Zeile 147: | ||
} | } | ||
- | SoSciTools.attachEvent(dropdown, | + | SoSciTools.attachEvent(dropdown, |
- | SoSciTools.attachEvent(dropdown, | + | SoSciTools.attachEvent(dropdown, |
- | toogle(); // Und zu Beginn auch die korrekte Anzeige sicherstellen | + | toggle(); // Und zu Beginn auch die korrekte Anzeige sicherstellen |
// --> | // --> | ||
</ | </ | ||
Zeile 157: | Zeile 221: | ||
// --> | // --> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Beispiel 4: Skala ===== | ||
+ | |||
+ | In diesem Beispiel soll ein Skalenitem mit 5 Auswahlmöglichkeiten (1=" | ||
+ | |||
+ | Außerdem soll die Lösung nicht nur für ein Item-Pärchen genutzt werden, sondern gleich für eine ganze Batterie (10 Skalen-Items und 10 Texteingabefelder, | ||
+ | |||
+ | Im folhenden Beispiel haben die Items folgende Kennungen: | ||
+ | |||
+ | * Skala: SK01_01 bis SK01_10 | ||
+ | * Texteingabe: | ||
+ | |||
+ | Der JavaScript-Code für die 10 Item-Pärchen würde wie folgt aussehen. Ein großer Teil des Codes entfällt dabei (ganz oben) darauf, erst einmal die Auswahlfelder eines jeden Skalenitems zu finden. Das hat den Vorteil, dass der Code unabhängig vom eingestellten Skalenniveau und unabhängig von Ausweichoptionen funktioniert. | ||
+ | |||
+ | Der Kern der Funktion, welcher das Eingabefeld ein- und ausblendet ist wieder das '' | ||
+ | |||
+ | <code javascript> | ||
+ | <script type=" | ||
+ | |||
+ | /** | ||
+ | * Auswahlfelder (radio) der Skala mit der | ||
+ | * Kennung itemID finden und auflisten. | ||
+ | */ | ||
+ | function getScaleInputs(itemID) { | ||
+ | var inputs = {}; | ||
+ | // Einmal die regulären Auswahlfelder | ||
+ | for (var i=1; i<100; i++) { | ||
+ | var inputID = itemID + i; | ||
+ | var input = document.getElementById(inputID); | ||
+ | if (input) { | ||
+ | inputs[i] = input; | ||
+ | } else { | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | // Und dann könnte es noch Ausweichoptionen geben | ||
+ | for (var i=-1; i>=-3; i--) { | ||
+ | var inputID = itemID + " | ||
+ | if (i == -1) { | ||
+ | inputID = itemID + " | ||
+ | } | ||
+ | var input = document.getElementById(inputID); | ||
+ | if (input) { | ||
+ | inputs[i] = input; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return inputs; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Die Klasse, welche das Skalenitem (Kennung itemID) mit | ||
+ | * einem Eingabefeld (o.ä.) mit der Kennung inputID verbindet. | ||
+ | * In dem Array show wird definiert, bei welchen Werten das | ||
+ | * Eingabefeld oder Element angezeigt werden soll. | ||
+ | */ | ||
+ | function linkScaleToInput(itemID, | ||
+ | // Wir benötigen zunächst alle Auswahldfelder des Skalenitems | ||
+ | var radio = getScaleInputs(itemID); | ||
+ | var element = document.getElementById(inputID); | ||
+ | |||
+ | // Wir brauchen eine Funktion, um den | ||
+ | // in der Skala ausgewählten Wert zu ermitteln. | ||
+ | function getValue() { | ||
+ | for (var value in radio) { | ||
+ | if (radio[value].checked) { | ||
+ | return parseInt(value); | ||
+ | } | ||
+ | } | ||
+ | return -9; | ||
+ | } | ||
+ | |||
+ | // Und dann benötigen wir eine Funktion, | ||
+ | // welche auf eine Auswahl reagiert | ||
+ | function onSelect() { | ||
+ | var value = getValue(); | ||
+ | |||
+ | // Anzeigen, wenn der Wert in show gelistet wurde, | ||
+ | // oder mittels display=none verbergen | ||
+ | if (show.indexOf(value) > -1) { | ||
+ | element.style.display = ""; | ||
+ | } else { | ||
+ | element.style.display = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (var value in radio) { | ||
+ | radio[value].addEventListener(" | ||
+ | } | ||
+ | |||
+ | // Zu Beginn die Anzeige korrekt wählen | ||
+ | onSelect(); | ||
+ | } | ||
+ | |||
+ | // Eine Instanz der Klasse für jedes Item der Skala | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | new linkScaleToInput(" | ||
+ | |||
</ | </ | ||
</ | </ |