Klaudia: wie herausfinden, welches Form-Element hat Focus?

Hallo!

Mittlerweile hab ich es endlich geschafft, auch mit dem Cursor in einem
Formularfeld auf das Event Keyup zu reagieren.
Leider musste ich hierfür den Eventhandler über alles definieren.
Somit wird die Funktion bei jedem Tastendruck angesprochen.
Mir wäre ja lieber gewesen, man hätte definieren können, dass die Funktion
tatsächlich nur bei der Taste XY aufgerufen wird, aber das geht wohl nicht (mit dem Netscape).

Jetzt stehe ich aber leider vor einem neuen Problem, weil ich jetzt nicht weiß, von welchem
Eingabefeld ich denn nun gekommen bin. Ich habe auch keinen Hinweis darüber gefunden, wie
ich dies irgendwo auslesen könnte.

Irgendwo aber muss doch im window-objekt oder im document-object die Information
stehen, welches Feld/Link ... nun aktiv ist.

Bin Euch dankbar für jede Hilfe!!

Klaudia

  1. Hallo Klaudia,

    leider kann ich dir nicht ganz folgen, wieso du nicht weisst, von
    welchem Eingabefeld du kommst, aber wenn du einen Keyevent in
    einem Feld hast, muesstest du dort in diesem Moment auch feststellen
    koennen, wo du bist, es da irgendwo zwischenspeichern und dann
    bei Bedarf abrufen.

    ich hoffe das dich das etwas weiterbringt, wenn nicht, waere es ganz
    sinnvoll wenn du deinen Code in Kurzform darstellst oder etwas
    genauer schilderst wie du das meinst.

    Sonia

    Jetzt stehe ich aber leider vor einem neuen Problem, weil ich jetzt nicht weiß, von welchem
    Eingabefeld ich denn nun gekommen bin. Ich habe auch keinen Hinweis darüber gefunden, wie
    ich dies irgendwo auslesen könnte.

    Irgendwo aber muss doch im window-objekt oder im document-object die Information
    stehen, welches Feld/Link ... nun aktiv ist.

    Bin Euch dankbar für jede Hilfe!!

    Klaudia

    1. Hallo Sonia,

      also zur Erläuterung...
      Momentan sieht der Scriptteil für meine zur Zeit zwei Eingabefeldern so aus:

      function key_handler(Ereignis) {
        ntaste = Ereignis.which;
        if (ntaste == 13) {
         if (ninput >= 2) {
          document.form1.submit();
         }
         if (ninput == 1) {
          ninput = 2;
          document.form1.passw.focus();
         }
        }
       }
      ninput = 1;
      window.captureEvents(Event.KEYPRESS);
      window.onkeypress = key_handler;

      Das ist leider eine ziemlich schwache Notlösung, da davon ausgegangen werden muss,
      dass der Benutzer auch tatsächlich immer Enter drückt.

      Leider hab ich nicht herausfinden können, in welchem Input-Feld der Benutzer gerade
      gestanden hat, wenn meine Funktion aufgerufen wird.

      Hintergrund der ganzen Sache soll die sein:
      Steht der Benutzer in einem beliebigen Eingabefeld (nur nicht das letzte), dann soll mit
      Enter in das nächste Feld gesprungen werden.
      Steht der Benutzer im letzten Feld und drückt Enter, wird das Formular abgeschickt.
      Hintergrund2:
      Ich schreibe eine kleine Anwendung, über die allerdings viele, sehr viele Eingaben erfolgen
      sollen und müssen, zum größten Teil numerisch. Dabei ist die Eingabe über die Maus und Tastatur
      einfach zu langsam.

      Vielen Dank für Deine Hilfe!

      Gruß,

      Klaudia
      einfach zu langsam

      1. Es gibt eine Moeglichkeit, mit der man die Tabulatortaste dazu
        benutzt um von Feld zu Feld zu springen. die Felder werden
        mit einem bestimmten Befehl Nummeriert und in dieser Reihenfolge
        kann man dann eben auch in die jeweiligen Felder schreiben.
        Wenn Enter nun die gleiche funktion haben soll, muesstest du
        praktisch nur die "Enter" Taste abfangen, und mit dieser Numerierung
        in der Tabulator-Reihenfolge abgleichen, sodass du genau weisst
        wann es soweit ist, das Formular abzuschicken.

        Es tut mir leid, ich hab das problem auch schonmal gehabt, muss
        jetz aber gehen und hab keine Zeit. Werde morgen mal nachschauen
        wos ist. Wollte dich jetzt nur nicht so in der Luft haengen lassen.

        bis morgen
        Sonia

        1. Hallo Sonia,

          muesstest du
          praktisch nur die "Enter" Taste abfangen, und mit dieser Numerierung
          in der Tabulator-Reihenfolge abgleichen, sodass du genau weisst
          wann es soweit ist, das Formular abzuschicken.

          Genau das hab ich vor. Nur diese Numerierung abzugleichen, weiss ich nicht wie.
          Momentan zähle ich durch. Bei jedem Return eins mehr usw.
          Wenn aber doch mal die Maus (oder Tab) bedient wird (zur Korrektur noch mal 3 Felder höher...)
          dann stimmts nicht mehr!

          Wollte dich jetzt nur nicht so in der Luft haengen lassen.

          Das ist total lieb, ich freu mich!

          viele Grüße,

          Klaudia

          1. Guten Morgen,

            also ich habe jetz mal nachgeschaut. Ich hab das im Applet geloest,
            das heisst mit Java. Da gibts eine nette Funktion, von der ich
            nicht weiss ob es die auch in Javascript gibt. Ich hab kein Javascript-Buch
            wo ich nachschauen kann.

            Jedenfalls kannst du dort mit

            Object obj = event.getSource();

            die Ereignisquelle eines Events abfangen. Das heisst du kannst GENAU
            auf deinen Button reagieren. In selfhtml hab ich den Befehl nicht
            gefunden, aber vielleicht gibts ihn ja doch irgendwo.

            moeglicher Folgecode waere:
            if (obj instanceof Button)
            {
              ....Code....
            }

            mit instanceof kannst du feststellen ob dein Object ein Textfeld oder
            ein Button (zum Beispiel) ist.

            1. Hi !

              Hab eine etwas elegantere Lösung gefunden, mit der ich mit der Enter-Taste die Tab-Taste simulieren kann:
              Ich hoffe, es läuft auch auf beiden Browsern richtig. (Hab's nur mit dem NN getestet)
              Die Javascript-Cracks unter Euch mögen mir verzeihen, ich mach normalerweise nicht soo viel mit Javascript.
              Sicherlich kann man das Eine oder Andere besser lösen.
              Aber mit dieser Version kann ich zunächst leben.

              Gruß,

              Klaudia

              <script LANGUAGE="JavaScript">
              nextfield = "feld1";
              ver = navigator.appVersion;
              len = ver.length;
              for(iln = 0; iln < len; iln++)
                 if (ver.charAt(iln) == "(") {
                     break;
                 }
              netscape = (ver.charAt(iln+1).toUpperCase() != "C");

              function keyDown(DnEvents) {
                 ntaste = (netscape) ? DnEvents.which : window.event.keyCode;
                 if (ntaste == 13) {
                     if (nextfield == 'fertig') {
                         return true;
                     } else {
                         eval('document.form1.' + nextfield + '.focus()');
                         return false;
                     }
                 }
              }
              document.onkeydown = keyDown;
              if (netscape) document.captureEvents(Event.KEYDOWN|Event.KEYUP);
              </script>

              ...und im body-Teil:

              <form name=form1>
              <input type=text name="feld1" onFocus="nextfield ='feld2';"><br>
              <input type=text name="feld2" onFocus="nextfield ='feld3';"><br>
              <input type=text name="feld3" onFocus="nextfield ='feld4';"><br>
              <input type=text name="feld4" onFocus="nextfield ='fertig';"><br>
              <input type=submit name="fertig" value="Abschicken">
              </form>

      2. Hallo !

        In diesem Thread im Archiv

        http://213.139.94.131/selfhtml/sfarchiv/2000_1/t11415.htm

        ging es darum, das Abschicken eines Formulars mittels ENTER-Taste außer für den Submit-Button zu unterbinden.

        Meines Erachtens sollte es mit der im Beispiel gezeigten Abfrage der Enter-Taste nicht nur möglich sein, diese ganz lahmzulegen (return false), sondern durch Erweiterung der Funktion und ggf. Parameterübergabe auch den Focus auf ein anderes (das nächste) Feld zu legen.

        Ich hoffe, dieser Ansatz hilft dir weiter.

        Ob dein Ansatz, zu prüfen, von welchen Feld der Benutzer zu einem bestimmten Feld gekommen ist, erfolgversprechend sein kann, wage ich zu bezweifeln, denn es dürfte m.E. schon schwierig sein festzustellen, ob er überhaupt von einem Formularfeld deines Dokumentes kam. Theoretisch könnte er z.B. auch zwischendurch eine eMail bekommen und dann erst diese schnell beantworten wollen, womit dein gesamtes Formular samt Browser den Focus verlöre. Somit hättest du m.E. auch kaum einen Einfluss darauf, zu bestimmen, welches Feld beim Zurückkommen zu deinem Formular den Focus erhalten soll.

        Gruß,

        kerki

        1. Hi Kerki,

          http://213.139.94.131/selfhtml/sfarchiv/2000_1/t11415.htm
          ging es darum, das Abschicken eines Formulars mittels ENTER-Taste außer für den Submit-Button zu unterbinden.

          funktioniert leider nur mit dem IE, der hier, ich muss es zugeben, sinnvollere Funktionen bietet als der NN.

          Ich hoffe, dieser Ansatz hilft dir weiter.

          leider nicht.

          Ob dein Ansatz, zu prüfen, von welchen Feld der Benutzer zu einem bestimmten Feld gekommen ist, erfolgversprechend sein kann, wage ich zu bezweifeln, denn es dürfte m.E. schon schwierig sein festzustellen, ob er überhaupt von einem Formularfeld deines Dokumentes kam. Theoretisch könnte er z.B. auch zwischendurch eine eMail bekommen und dann erst diese schnell beantworten wollen, womit dein gesamtes Formular samt Browser den Focus verlöre. Somit hättest du m.E. auch kaum einen Einfluss darauf, zu bestimmen, welches Feld beim Zurückkommen zu deinem Formular den Focus erhalten soll.

          Ich hatte mir das so vorgestellt, dass beim Drücken einer Taste meine Funktion aufgerufen wird.
          Damit hat mein Fenster schonmal sicher den Focus.
          Normalerweise ist beim erneuten Aktivieren meines Fensters der Cursor wieder automatisch im zuletzt aktivierten Feld.
          Viele Arten von Feldern, die einen Focus erhalten können gibts ja nicht, nur Formularfelder und Links.
          Da ich zumindest allen Formularfeldern einen Namen mitgeben kann, sollte es prinzipiell nicht so schwer sein,
          dass aktive Element feststellen zu können.
          Ich meine, irgendwo muss ja auch der Browser die Reihenfolge handeln, wenn die Tab-Taste gedrückt wurde.

          Wenn es gehen könnte, dass ich die Enter-Taste abfange, und anstelle dessen den Wert für die Tabtaste weiterschicke,
          wäre ich auch schon einen riesigen Schritt weiter. Aber wie das geht, weiss ich auch wieder nicht, leider!

          Gruß,

          Klaudia