Ahnungsloser: Was ist ein Event-Handler?

Hallo.

In der Literatur werden Attribute wie onclick als Event-Handler bezeichnet. Müßte man aber nicht richtigerweise die von onclick eigentlich aufgerufene Funktion als Event-Handler bezeichnen? Aber wie kann man dann onclick bezeichnen?

  1. Hellihello

    na wenn

    meinDiv=document.getElementById("meineId");

    ist und

    meinDiv.onclick=function() {
     alert("hw");
    }

    dann würde ich nicht sagen, dass das alert der Handler ist. Der Eventhandler ist der, der die Events handeld, also weiss, um welchen Event es sich handelt, den onclick, den onmousemove oder oder oder. Find ich logisch so, oder verstand ich was falsch?

    Gruß,

    frankx

  2. Hi,

    In der Literatur werden Attribute wie onclick als Event-Handler bezeichnet. Müßte man aber nicht richtigerweise die von onclick eigentlich aufgerufene Funktion als Event-Handler bezeichnen?

    wenn man es genau nimmt, hast du absolut Recht. Der Eventhandler ist selbstverständlich die Funktion, die den Event, das Ereignis, bearbeitet. Allerdings hat sich auch hier eine Vereinfachung der Ausdrucksweise eingeschlichen. Es ist daher durchaus üblich, wenn auch nicht wirklich korrekt, das HTML-Attribut "onclick" bereits als den Eventhandler zu bezeichnen.

    Aber wie kann man dann onclick bezeichnen?

    Kommt auf den Kontext an. In HTML

    <button onclick="reloadPhoto(4)">Neuladen</button>

    ist es eigentlich nur ein HTML-Attribut, das den Browser veranlasst, einen Eventhandler selbst zu erzeugen. In einer Javascript-Anweisung

    ~~~javascript image.onclick = function()
      { alert("Buh!");
      };

      
    ist onclick genaugenommen eine Referenz, ein Zeiger auf den Eventhandler, also auf die eigentliche Funktion. Aber wie gesagt, es ist durchaus üblich, dass man das im Alltag alles über einen Kamm schert.  
      
    Schön, wenn sich trotzdem mal jemand die Mühe macht, solche Schlampereien zu hinterfragen. :-)  
      
    So long,  
     Martin  
    
    -- 
    [Mir geht es gut.](http://www.baetzler.de/humor/30_tage_schnee.html) Ich mag die kleinen Pillen, die sie mir dauernd geben.  
    Aber warum bin ich ans Bett gefesselt?
    
    1. Danke, Martin. Ich weiß, es ist wird umgangssprachlich nicht immer korrekt auseinander gehalten. Aber manchmal ist es mißverständlich, was gemeint ist.

      Hätte trotzdem gerne einen Begriff für das spezielle Attribut bzw. die Eigenschaft onclick, wenn man sie im Skript mit document.onclick oder wie auch immer zuweist. Wenn es keinen Begriff gibt, muß ich für mich einen erfinden oder aber umschreiben, was gemeint ist.

    2. Hellihello

      In der Literatur werden Attribute wie onclick als Event-Handler bezeichnet. Müßte man aber nicht richtigerweise die von onclick eigentlich aufgerufene Funktion als Event-Handler bezeichnen?

      wenn man es genau nimmt, hast du absolut Recht. Der Eventhandler ist selbstverständlich die Funktion, die den Event, das Ereignis, bearbeitet.

      Mh, den Punkt den ich machen wollte ist der: weder das HTML-Attribut ist der Handler (das ist ja nur eine Krücke, in der reinen JS-Notation zb. div.onlick=function() {} wird das deutlicher) noch die Funktion, die am Ende aufgerufen wird. Der Handler müsste doch (analog zum Port-Listener bei einem Server) genaugenommen der Teil sein, der erkennt, welcher Event gerade stattfindet. Unabhängig davon, ob dem entsprechenden Element dann eine spezielle Funktion zur Ausführung bei eben diesem Event zugeordnet ist oder nicht. Gibts da nicht auch einen Event-Listener?

      Gruß,

      frankx

      1. Hallo,

        Der Handler müsste doch (analog zum Port-Listener bei einem Server) genaugenommen der Teil sein, der erkennt, welcher Event gerade stattfindet. Unabhängig davon, ob dem entsprechenden Element dann eine spezielle Funktion zur Ausführung bei eben diesem Event zugeordnet ist oder nicht.

        nein, was du beschreibst, bezeichnet man normalerweise eher als Event-Dispatcher (Verteiler), der alle Events erhält und daraufhin untersucht, welcher Handler -wenn überhaupt einer- dafür zuständig ist.

        Ein Handler ist dagegen der Teil Code, der das erkannte und zugeordnete Ereignis tatsächlich "händelt". Diese Begriffe werden auch in der Anwendungs-Programmierung üblicherweise so gebraucht.

        Gibts da nicht auch einen Event-Listener?

        Ja, aber frag' mich jetzt nicht, wo der einzuordnen ist. Ich meine, das ist eher mit dem Eventhandler gleichzusetzen, weil der EventListener ja schon auf einen ganz bestimmten Event lauscht.

        Ciao,
         Martin

        --
        Idealismus wächst mit der Entfernung zum Problem.
        1. Hallo Martin,

          Gibts da nicht auch einen Event-Listener?
          Ja, aber frag' mich jetzt nicht, wo der einzuordnen ist. Ich meine, das ist eher mit dem Eventhandler gleichzusetzen, weil der EventListener ja schon auf einen ganz bestimmten Event lauscht.

          Im wesentlichen sind die Begriffe "Listener", "Observer" und "Handler" wohl synonyme für "das Ding, dass das Ereignis verarbeitet". Man kann das höchstens etwas vom Hintergrund unterscheiden. "Handler" meint oft einfach nur eine Callback-Funktion, die ein Ereignis verarbeitet. "Observer" kommt aus der Entwurfsmuster-Ecke und bezeichnet ein Objekt, das Callback-Methoden hat, die für Ereignisse aufgerufen werden. Meist sieht man in Darstellungen dieses Konzepts keine konkrete Darstellung des Ereignisses als Objekt. "Listener" kommt auch aus der Objektorientierung und beschreibt ein Objekt, das Ereignisse verarbeitet. Der Begriff kommt wohl aus der Java-Ecke und typischerweise gibt es da ein Ereignis-Objekt.
          Zu guter letzt gibt es dann noch die Trigger aus der Datenbankwelt, die im wesentlichen auch das gleiche Konzept bezeichnen ;)

          Für die Eigenschaft kenne ich auch keinen Begriff. Vermutlich ist es zweckmäßig, einfach von Eventhandlerattribut o.ä. zu reden...

          Grüße

          Daniel

    3. Hi,

      wenn man es genau nimmt, hast du absolut Recht. Der Eventhandler ist selbstverständlich die Funktion, die den Event, das Ereignis, bearbeitet.

      diese Funktion ist object.onclick(). Dass dort in aller Regel eine Referenz auf eine (zumeist anonyme) Funktion hinterlegt ist, tut relativ wenig zur Sache - derlei Dinge sind in objektorientierten Umgebungen mehr als üblich.

      Allerdings hat sich auch hier eine Vereinfachung der Ausdrucksweise eingeschlichen. Es ist daher durchaus üblich, wenn auch nicht wirklich korrekt, das HTML-Attribut "onclick" bereits als den Eventhandler zu bezeichnen.

      Jo. Der Wert dieses Attributes wird ungefähr in der Art

      object.onclick = function() { eval("..."); }

      als Event-Handler gespeichert.

      Aber wie kann man dann onclick bezeichnen?
      Kommt auf den Kontext an. [...]

      Zustimmung. Ich tendiere allerdings dazu, ein irgendwo vorkommendes "onfoo" als Event-Handler des "foo"-Events zu bezeichnen. Unterschiede mache ich i.d.R. nur dann, wenn es auf diese ankommt, z.B. wenn ein Attributwert auf o.g. Weise umgewandelt wird.

      Aber wie gesagt, es ist durchaus üblich, dass man das im Alltag alles über einen Kamm schert.

      Genau :-)

      Schön, wenn sich trotzdem mal jemand die Mühe macht, solche Schlampereien zu hinterfragen. :-)

      Doppelgenau ;-)

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
    4. Hello,

      <button onclick="reloadPhoto(4)">Neuladen</button>

      ist es eigentlich nur ein HTML-Attribut, das den Browser veranlasst, einen Eventhandler selbst zu erzeugen. In einer Javascript-Anweisung

      image.onclick = function()

      { alert("Buh!");
        };

      
      >   
      > ist onclick genaugenommen eine Referenz, ein Zeiger auf den Eventhandler, also auf die eigentliche Funktion. Aber wie gesagt, es ist durchaus üblich, dass man das im Alltag alles über einen Kamm schert.  
        
      Es ist der "Trigger" für den Handler. So würde ich das jedenfalls bezeichnen.  
      Ein echter "Interrupt" oder "Interrupt-Request" liegt da ja nicht vor. Das Message-Modell des Betriebssyystems (oder des Browsers) fängt die Ereignisse ab und regelt, wann sie wohin weitergeleitet werden.  
        
        
        
        
        
      Harzliche Grüße vom Berg  
      <http://bergpost.annerschbarrich.de>  
        
      Tom
      
      -- 
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen  
      Nur selber lernen macht schlau  
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)  
        
      ![](http://bitworks.de/~selfHTML/Virencheck.gif)  
      
      
  3. gruss Ahnungsloser, hallo in die runde,

    In der Literatur werden Attribute wie onclick als Event-Handler
    bezeichnet. Müßte man aber nicht richtigerweise die von onclick
    eigentlich aufgerufene Funktion als Event-Handler bezeichnen?

    das "event listening / event handling" ist ein mehrschichtiges
    abstraktionsmodell, das sich mit einem einzigen griffigen wort
    nur schwer beschreiben laesst. das wird wohl der grund dafuer,
    sein, dass "event handling" in der literatur bevorzugung erfaehrt

    die basis jeden "event handling"s bildet ein [[EventTarget]]-
    objekt. das ist jenes objekt, auf dem events an- und abgemeldet
    werden und das ebenjene events auch aussenden (*werfen*) kann.

    die folgenden, gerade in beschreibenden worten angerissenen
    methoden muessen z.b. in den aktuellen (DOM-)implementierungen
    mehr oder weniger so umgesetzt sein:

    [EventTarget].addEventListener = (function (type, handler) {...});  
    [EventTarget].removeEventListener = (function (type, handler) {...});  
    [EventTarget].dispatchEvent = (function (evt) {...});
    

    beim anmelden wird fuer [EventTarget] ein [[EventListener]]-
    objekt erzeugt, welches sich ueber den string-value "type"
    und seinen funktionalen parameter "handler" identifiziert.
    dabei representiert erstgenanntes argument den "event type"
    also den *identifier*, das *label*, den *namen* unter dem
    sich letztgenannte methode ueber genau diesen [EventListener]
    adressieren laesst.

    d.h.: auf einem [EventTarget] koennen mehrere aber trotzdem
    verschiedene [EventListener] unter gleichem namen bzw. typ
    angemeldet werden.

    der [EventListener] wiederum kapselt ein [[Event]]-objekt
    und stellt eine methode [handleEvent] bereit, die fuer
    [EventTarget] *sichtbar* ist und von dessen [dispatchEvent]-
    methode genutzt wird.

    [Event] ist die ebene der geringsten abstraktion. diese objekte
    kapseln unter anderem referenzen auf "target" und "type", wobei
    "target" der dazugehoerigen [EventTarget]-referenz und "type"
    dem "event type" entspricht. ueber diese kontrollinstanz laesst
    sich eine versehentliche und/oder missbraeuchliche manipulation
    des event-objekts ueber die [dispatchEvent]-methode eines
    [EventTarget]s verhindern.

    Aber wie kann man dann onclick bezeichnen?

    [HTMLElement].onclick = (function () {...}); laesst sich als
    direkte referenz auf eine funktion, also als ein "event handler"
    lesen, ...

    ... dafuer gibt es bei ...

    [HTMLElement].addEventListenr("click", [anonyme funktion oder referenz (*1)], [false|true]);

    ... dann den intern ueber [EventListener] referenzierten [onclick]-
    handler (*1), waehrend "click" hier nur den "event type" oder auch
    den "event listener identifier" bzw. das "event listener label"
    markiert.

    die beiden beispiele unterscheiden sich darin, dass zuletzt
    aufgefuehrtes anmeldung und ausfuehrung mehrerer (event-)handler
    auf einem event(-typ) zulaesst. ersteres buegelt gnadenlos immer
    den zuletzt referenzierten event-handler ueber die bis dato
    gueltige referenz drueber.

    "event handler" ist also keineswegs falsch, auch nicht ungenau,
    sondern einfach zutreffend.

    siehe auch meinereinigen kurzen forumsmonolog zu:

    custom events/[EventDispatcher] fuer nicht-DOM-objekte?

    ... und hier noch etwas *quaelcode* zum gucken und rumspielen:

    http://www.pseliger.de/jsExtendedApi/jsApi.EventDispatcher.dev.js

    http://www.pseliger.de/jsExtendedApi/jsApi.EventDispatcher.hybrid.js
    http://www.pseliger.de/jsExtendedApi/jsApi.EventDispatcher.js

    http://www.pseliger.de/jsExtendedApi/jsApi.EventDispatcher.dev.html

    so long - peterS. - pseliger@gmx.net

    --
    »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
    Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
    ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
    1. Hallo peterS.,

      [HTMLElement].addEventListenr("click", [anonyme funktion oder referenz (*1)], [false|true]);

      nur eine kurze Zwischenfrage: funktioniert addEventListener in allen Browsern?

      Gruß, Jürgen

      1. gruss Jürgen,

        [HTMLElement].addEventListenr("click", [anonyme funktion oder referenz (*1)], [false|true]);

        nur eine kurze Zwischenfrage: funktioniert addEventListener in allen Browsern?

        nein - als DOM-methode natuerlich nicht, der meistverbreitetste browser
        *kennt* dafuer [attachEvent] / [detachEvent]. aber das weist Du doch
        selber. warum fragst Du? fuer die von mir gegebene antwort auf die frage
        des OP ist der unterschied in den implementierungen doch bedeutungslos.

        falls Du Dich aber auf den anhang ", und wie erzeuge ich eigene Events?"
        beziehst ... ja dort funktionieren [addEventListener] und co tadellos.

        so long - peterS. - pseliger@gmx.net

        --
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
        1. Hallo Peter,

          weil Du hier so selbstverständlich "addEventListener" erwähnt hast, dachte ich, das es jetzt Browserübergreifend geht. Ich hätte ja mal bei quirksmode.org reinschauen können. Da werde ich wohl weiter mit meiner Bastellösung arbeiten müssen. Danke für deine Antwort.

          Gruß, Jürgen