bastold: Script aktiv, auch wenn es nicht aufgerufen wird.

Hi!

Ich habe folgendes Problem:

Ich habe ein Formular, welches mehrere Texteingabefelder beinhaltet.

Bei einem der Eingabefelder wird eine Liste an Auswahlmöglichkeiten angezeigt, sobald ich drei Buchstaben eingegeben habe. Die Inhalte der Auswahlliste werden per Ajax erzeugt, das Navigieren durch diese Liste erfolgt über ein Javascript-Funktion ("NavigationDurchAuswahlliste"), welches Mausposition, Mausklick bzw. das Keyboard nach gedrückten Tasten abfragt.

Diese Function rufe ich im Ajax-Script so auf

  
     if (http_request.readyState == 4) {  
         if (http_request.status == 200) {  
            eval(NavigationDurchAuswahlliste);  
         }  
	}  

Das funktioniert alles auch bestens. Ich kann problemlos durch die Auswahlliste navigieren; das Keyboard wird in der Function "NavigationDurchAuswahlliste" wird mit document.onKeyDown abgefragt.

Nun habe ich aber festgestellt, dass das onKeyDown und damit sozusagen die Function "NavigationDurchAuswahlliste" auch dann anspringt/ aufgerufen wird, wenn der Focus in einem anderen Formularfeld ist, als in dem, wo das Ajaxscript aufgerufen wird.

Es ist mir klar, dass document.onKeyDown jeglichen Tastenanschlag abfragt, der irgendwo im Document vorgenommen wird. Aber an sich dürfte doch der Befehl gar nicht ausgeführt werden, da die Function, die diesen Befehl beinhaltet, ja überhaupt nicht aufgerufen wird.

Und das ist das, was ich nicht verstehe.  Warum passiert das? Ich sehe mit Firebug, dass der eigentliche Ajaxrequest zum Server nicht passiert, wenn ich in den anderen Eingabefeldern etwas eingebe. Schon von daher dürfte doch auch obiger eval-Code (eval(NavigationDurchAuswahlliste)) nicht ausgeführt werden und schon gar nicht, oder?

Oder behält Firefox ein Skript immer im Speicher, wenn es per Ajax initiiert wurde?

Hat jemand eine Idee? Danke.

  1. Hi,

    Nun habe ich aber festgestellt, dass das onKeyDown und damit sozusagen die Function "NavigationDurchAuswahlliste" auch dann anspringt/ aufgerufen wird, wenn der Focus in einem anderen Formularfeld ist, als in dem, wo das Ajaxscript aufgerufen wird.

    Es ist mir klar, dass document.onKeyDown jeglichen Tastenanschlag abfragt, der irgendwo im Document vorgenommen wird. Aber an sich dürfte doch der Befehl gar nicht ausgeführt werden, da die Function, die diesen Befehl beinhaltet, ja überhaupt nicht aufgerufen wird.

    document.onKeyDown ist kein "Befehl", sondern eine Eigenschaft.
    Und wenn du dieser speziellen Eigenschaft ein mal eine Funktion zugewiesen hast, die sich um diesen Event kümmern soll - dann macht die das auch, so lange du das nicht explizit wieder rückgängig machst.

    Und das ist das, was ich nicht verstehe.  Warum passiert das?

    Weil Eventhandling so funktioniert.

    Oder behält Firefox ein Skript immer im Speicher, wenn es per Ajax initiiert wurde?

    Nein, das hat mit AJAX nichts zu tun.

    Hat jemand eine Idee?

    Beschäftige dich mal damit, wie Eventhandling grundsätzlich funktioniert.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Beschäftige dich mal damit, wie Eventhandling grundsätzlich funktioniert.

      Ok, hab mir jetzt mal einige Webseiten zum Thema Eventhandling angeschaut. Aber entweder nicht die richtigen oder ich bin zu blöd dafür :(

      Gehe ich nach deinen Ausführungen, dann ist es so, wenn irgendwann im Programmablauf jemals ein Eventhandler aktiviert wurde, dann ist dieser ab diesem Zeitpunkt ständig aktiv, auch wenn dieser in einer function aktiviert wurde, die im weiteren Programmablauf nicht mehr aufgerufen wird?

      1. Mahlzeit bastold,

        Gehe ich nach deinen Ausführungen, dann ist es so, wenn irgendwann im Programmablauf jemals ein Eventhandler aktiviert wurde, dann ist dieser ab diesem Zeitpunkt ständig aktiv, auch wenn dieser in einer function aktiviert wurde, die im weiteren Programmablauf nicht mehr aufgerufen wird?

        Ja. Wenn einem Ereignis (engl. "event") ein Event-Handler (also ein Stück Programmcode, das dieses Ereignis behandelt) zugewiesen wurde, dann tut der Event-Handler genau das: er wird ausgeführt, wenn das Ereignis eintritt. Es spielt dabei absolut keine Rolle, wann, wo oder durch wen dieser Event-Handler zugewiesen wurde ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:& n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      2. Gehe ich nach deinen Ausführungen, dann ist es so, wenn irgendwann im Programmablauf jemals ein Eventhandler aktiviert wurde, dann ist dieser ab diesem Zeitpunkt ständig aktiv, auch wenn dieser in einer function aktiviert wurde, die im weiteren Programmablauf nicht mehr aufgerufen wird?

        In erster Linie scheinen dir die richtigen Begriffe zu fehlen, weshalb ich schon dein Ausgangsposting nicht recht verstanden habe.

        Ein Event-Handler wird nicht »aktiviert«, sondern man registriert eine Funktion als Handler für ein gewisses Ereignis. Diese Funktion wird aufgerufen, immer wenn das überwachte Ereignis eintritt. Das Ereignis kann nach dem Registrieren fünftausend Mal eintreten – dann wird die Handler-Funktion auch fünftausend Mal aufgerufen.

        Wenn du ein Ereignis nur spezifisch überwachen willst, so kannst du folgendes tun:

        • Sofern möglich, überwache das Ereignis an der richtigen Stelle, also einem passenden Element anstatt dokumentweit.
        • Beende die Ereignisverarbeitung wieder, wenn sie nicht mehr benötigt wird (siehe Links).

        Grundlagen zur Ereignisverarbeitung
        Event-Überwachung beenden (beim traditionellen Event-Handling)
        Fortgeschrittene Ereignisverarbeitung (addEventListener, removeEventListener)

        Mathias