innerhalb Funktion auf spez. Buttonklick warten
Mareike
- javascript
Hallo!
Ich habe schon seit ein paar Tagen ein Problem und schon diverse Lösungsansätze probiert - leider bisher erfolglos.
Es handelt sich um folgendes:
Ich muss im Prinzip einen Fragebogen mit JavaScript simulieren. In diesem Fragebogen kann man im HTML-Dokument pro Frage zwei Antwort-Buttons wählen ('ja' und 'nein'), die dann zu den jeweiligen darauffolgenden Fragenweiterleiten sollen.
Die dazugehörige JS Datei soll die Abhandlung des Fragebogens in einer einzigen Funktion realisieren. Darin besteht auch das eigentliche Problem: Man muss also innerhalb der JS Funktion auf einen der beiden ButtonKlicks warten und dann per If-else entscheiden, welcher Button es war um dann die richtige darauf folgende Frage zu holen. Es muss im schlimmsten Fall unendlich gewartet werden können --> so lang bis der Klick erfolgt ist.
Ich habe schon sämtliche do-while Optionen durchprobiert, aber das führt ja nur zur 100%igen CPU Auslastung und zum Einfrieren des Browsers. Das soll natürlich in jedem Fall vermieden werden.
HTTML:
<input type="button" id="btnLEFT" value="-- JA --" style="FONT-WEIGHT: bold" onclick="eventHappened('btnLEFT')">
<input type="button" name="btnRIGHT" value="-- NEIN --" style="FONT-WEIGHT: bold" onclick="eventHappened('btnRIGHT')">
JAVA SCRIPT:
var m_btnID = "none";
function main()
{
...
HIER AUF EINEN KLICK WARTEN
if(m_btnID = "btnLEFT")
{}
else
{}
...
}
function eventHappened(btnID)
{
m_btnID = btnID;
}
Kann mir jemand helfen? Hat jemand ein ähnliches Problem? Hat jemand einen guten Tipp oder hatte tatsächlich schon mal dieses Problem?
Vielen Dank schon mal
Mareike :)
Hallo Mareike,
Javascript kann nicht warten. Entweder du benutzt Eventhandler, wie z.B. onchange, die eine "Weiterbearbeitungsfunktion" aufrufen, oder Du machst dich mit setTimeout/setInterval vertraut. Dann kannst Du Dein Formular alle "paar" Millisekunden überprüfen, ohne dass die CPU-Last auf 100% geht.
Gruß, Jürgen
PS Komische Vorgabe: Alles in einer Funktion. Übungsaufgabe?
Hallo Jürgen,
vielen Dank für deine Antwort.
Ich habe die Eventhandler schon probiert, das Problem dabei ist tatsächlich, die "Weiterarbeitungsfunktion"... Meine Zielsetzung ist ja leider immer noch, dass ich nur die eine Funktion nutzen will.
Bei SetTimeout bzw SetIntervall habe ich das Problem, dass der nach diesem Aufruf aufgeführte Code auch direkt ausgeführt wird, obwohl ich das ja auch nicht will... :) Da könnte ich natürlich auch alles nachfolgende in eine Funktion packen, auslagern und dem SetTimeout bzw SetIntervall als Parameter mitgeben. Und genau das versuche ich auch wiederum zu vermeiden...
Hehe, nein keine Übungsaufgabe... die Idee könnte aber von einem nicht sehr weit denkenenden Prof/Lehrer kommen! :) Ich habe in meinem Projekt fertige JS Dateien bekommen, die ursprünglich mit einem Gerät funktionieren. Ich soll das Verhalten des Geräts nun als HTML Projekt simulieren, damit man diese JS für das Gerät leichter modifizieren kann. Diese ursprünglichen Dateien sind nun mal schön alle in einer einziegen Funktion realisiert. Und ich versuche es nun so beizubehalten, damit dann das Rückkonvertieren leichter geht!
hat noch jemand Anregungen oder Ideen? Würde mich freuen!!
Mareike
Hi,
Ich habe die Eventhandler schon probiert, das Problem dabei ist tatsächlich, die "Weiterarbeitungsfunktion"... Meine Zielsetzung ist ja leider immer noch, dass ich nur die eine Funktion nutzen will.
Eine funktion reicht doch aus. Du musst diese nur bei jedem Button-Klick (onclick) neu aufrufen:
Dein Code leicht verändert:
<input type="button" id="btnLEFT" value="-- JA --" style="FONT-WEIGHT: bold" onclick="main('btnLEFT')">
<input type="button" name="btnRIGHT" value="-- NEIN --" style="FONT-WEIGHT: bold" onclick="main('btnRIGHT')">
function main(buttonValue)
{
if(button == "btnLEFT")
{}
else
{}
...
}
Hoffe das hilft dir weiter.
mfG,
steckl
Sorry, noch ein Tippfehler:
function main(buttonValue)
{
if(buttonValue == "btnLEFT")
{}
else
{}
...
}
mfG,
steckl
Danke für euren Support!
@steckl:
Genauso hatte ich es schon mal implementiert und es hat gut funktioniert, leider ist der zugehörige Konvertierungsalgorithmus (also dass die JS wieder für das Gerät nutzbar ist) gar nicht so leicht gewesen, bzw. mir ist keine "adaptive und intelligente" Lösung eingefallen... Vielleicht lasse ich es noch mal auf einen Versuch ankommen.
@cybaer:
Die Lösung hört sich gut an. Ich habe noch Probleme beim Entwurf einer konzeptuellen Lösung deines Vorschlags mit Callern! Könntest du mir ein Beispiel geben? Wie genau kannst du festestellen welcher Zweig aktiv werden soll? Caller geben (sofern ich es richtig verstanden habe) Null zurück, wenn sie aus der eigenenen Funktion aufgerufen wurden... Das würde mir ja bzgl der genauen Position nichts bringen.
Viele Grüße
Mareike
Hi,
Die Lösung hört sich gut an. Ich habe noch Probleme beim Entwurf einer konzeptuellen Lösung deines Vorschlags mit Callern!
http://de.selfhtml.org/javascript/objekte/function.htm#caller
Damit kannst Du feststellen, von wo aus die Funktion aufgerufen wurde - ggf. also von sich selbst.
Aber da ich mir nicht sicher bin, wie groß die Unterstützung ist (deprecated ist die Eigenschaft nicht), würde ich dir raten, anhand des Parameters zu testen. steckls Vorschlag ging auch in diese Richtung.
Du kannst, im Zweifel mit typeof(), feststellen, welcher Art der Parameter ist, und mal in den einen, mal in den anderen Zweig der Routine gehen (s. steckl).
Gruß, Cybaer
Hi,
Du kannst, im Zweifel mit typeof(), feststellen, welcher Art der Parameter ist, und mal in den einen, mal in den anderen Zweig der Routine gehen (s. steckl).
Du könntest auch einen zweiten Parameter einführen, der dir dann sagt, was zu tun ist, bevor du das 'Ja' oder 'Nein' auswertest.
mfG,
steckl
Hi,
Meine Zielsetzung ist ja leider immer noch, dass ich nur die eine Funktion nutzen will.
Zielsetzungen müssen nicht immer sinnvoll sein. ;-) Zumal wenn man eine Zielsprache noch nicht so gut kennt. ;)
Ansonsten: Du kannst alles in eine Funktion packen, und dann, wenn nötig, die Funktion aus sich selbst heraus aufrufen. Anhand der übergebenen Parameter oder der Funktions-Eigenschaft caller kannst Du dann feststellen, welcher Zweig innerhalb deiner Mega-Funktion jetzt aktiv sein sollte.
Gruß, Cybaer