Andreas Nagel: wie entferne ich diesen eventlistener?

Hallo zusammen

auf meiner Seite verwende ich eventlistener um darauf aufzupassen das Login Daten nur so lange eingebelndet bleiben wie diese auch wirklich gebraucht werden wollen. Also klicke ich auf irgend einen anderen Bereich der Seite oder werde ich auf diese sonst noch irgendwie aktiv, sollen diese sofort wieder ausgeblendet werden.

Und so dachte ich dem iframe einen eventlistener zuzuweisen wenn die Daten eingeblendet werden und wenn diese ausgeblendet werden den eventlistener auch gleich wieder zu entfernen:

  
function ShowLinkDaten(Link, DBID)  
{  
top.frames["DatenFrame"].window.addEventListener("focus", function() {FrameFocus(DBID)}, false)  
}  
function HideLinkDaten(DBID)  
{  
top.frames["DatenFrame"].window.removeEventListener("focus", function() {FrameFocus(DBID)}, false);  
}  

Doch hfunktioniert das removeeventlistener irgendwie nicht. Also wie soll ich das bitte dann schreiben?

Würde mich freuen wenn mir jemand helfen könnte, damit das alles wieder funktionieren könnte! Und vielleicht ist dies mal der erste schritt und ich komme absolut nicht weiter.

Also vielen Dank Gruß Andreas

  1. Hallo Andreas,

    function ShowLinkDaten(Link, DBID)
    {
    top.frames["DatenFrame"].window.addEventListener("focus", function() {FrameFocus(DBID)}, false)
    }
    function HideLinkDaten(DBID)
    {
    top.frames["DatenFrame"].window.removeEventListener("focus", function() {FrameFocus(DBID)}, false);
    }

      
    ich vermute, remove bleibt ohne Wirkung, da du eine anonyme Funktion als Handler verwendest. Versuch es mal mit einer benannten Funktion:  
      
    ~~~javascript
    function focushandler ()  
    {  
      FrameFocus(DBID)  
    }  
    function ShowLinkDaten(Link, DBID)  
    {  
      top.frames["DatenFrame"].window.addEventListener("focus", focushandler ,false)  
    }  
    function HideLinkDaten(DBID)  
    {  
      top.frames["DatenFrame"].window.removeEventListener("focus", focushandler false);  
    }
    

    Gruß, Jürgen

    1. Hallo zusammen

      und schonmal vielen Dank! Doch bnisher kann ich dem Ganzen nicht folgen. Denn FrameFocus ist eine Funktion mit einem Parameterr und wird ja auch einwandfrei ausgeführt. Und den dafür notwendigen Parameter soll dafür in den Funktionen, welche den Listener vergeben oder löschen sollen übergeben werden. Ansonsten müsse es ja eine offene Variable sein um die Funktion mit Parameter in eine, wie gezeigt, extra Listener Funktion zu setzen.

      Also freue mich über weitere Hilfe und schonmmal dafür gerne Danke

      Gruß Andreas

      1. Hallo Andreas,

        hast du meinen Änderungsvorschlag ausprobiert?

        Gruß, Jürgen

        1. Hallo Jürgen

          Absolutes Dankeschön für diese geniale Sache! Ich konnte dies halt nicht nachvollziehen, da man für mich auch die Variable zur Verfügung stellen muss. Und dass auch so die Werte zur Verfügung gestellt werden macht schon einiges einfacher.

          Also mal sehen das ich so zum endziel ankomme und auf jeden Fall schonmal vilen Dank dafür.

          Gruß Andreas

  2. Hallo Andreas,

    bei focus muss useCapture true sein.

    top.frames["DatenFrame"].window.addEventListener("focus", function() {FrameFocus(DBID)}, true)

    grüsse quincunx

    1. Hallo,

      bei focus muss useCapture true sein.

      Muss es hier nicht.

      top.frames["DatenFrame"].window.addEventListener("focus", function() {FrameFocus(DBID)}, true)

      Das ist in dem Fall egal, weil das window-Objekt das Target des Events ist, nicht ein Element im Dokument. Der focus-Event wird also in der Target-Phase verarbeitet.

      Focus-Events bei Elementen gibt es natürlich auch (z.B. input), und du hast recht, sie steigen nicht auf, können also nicht beim window in der Bubbling-Phase überwacht werden. Aber hier reicht das Überwachen des focus-Events beim window aus, sofern ich die Problembeschreibung richtig verstanden haben. Der Event wird beim (erstmaligen) Klicken auf das Dokument im Iframe gefeuert.

      Übrigens gibt es den bubblenden Event focusin, der von allen Browsern außer Firefox unterstützt wird. Capturing für focus wäre also für Firefox nötig.

      Mathias

  3. Tach!

    top.frames["DatenFrame"].window.addEventListener("focus", function() {FrameFocus(DBID)}, false)

    Du erzeugst eine Instanz einer anonymen Funktion und übergibst sie.

    top.frames["DatenFrame"].window.removeEventListener("focus", function() {FrameFocus(DBID)}, false);

    Du erzeugst wieder eine Instanz einer anonymen Funktion und übergibst sie. Die ist aber nicht registriert und kann nicht entfernt werden. Die andere Instanz bleibt aber da.

    Doch hfunktioniert das removeeventlistener irgendwie nicht. Also wie soll ich das bitte dann schreiben?

    Du musst dieselbe Instanz angeben. Es geht nicht, wenn man eine weitere Instanz erzeugt, auch wenn diese denselben Code enthält. Das heißt also, dass du dir einen Verweis auf die Instanz irgendwo merken musst, damit du genau diese Instanz wieder übergeben kannst. Ein Vorschlag dazu kam ja schon von JürgenB.

    dedlfix.