Mareike: innerhalb Funktion auf spez. Buttonklick warten

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 :)

  1. 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?

    1. 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

      1. 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

        1. Sorry, noch ein Tippfehler:

          function main(buttonValue)
          {

          if(buttonValue == "btnLEFT")

          {}
             else
             {}
             ...
          }

          mfG,
          steckl

        2. 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

          1. 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

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            1. 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

      2. 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

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!