Axel Richter: 2 Probleme mit DHTML

Beitrag lesen

Hallo,

Natürlich erwartet addEventListener eine einfache JavaScript-Funktion als Parameter. (Genauer gesagt ein Funktionsobjekt als Referenz.)

Nein, eigentlich nicht. Ein DOM-Node implementiert das Inteface EventTarget http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget. Nur deshalb gibt es Node.addEventListener() überhaupt. Die Methode
  void               addEventListener(in DOMString type,
                                      in EventListener listener,
                                      in boolean useCapture);
erwartet genau diese Parameter. Ein EventListener http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventListener ist ein Interface, welches von der Funktion implementiert wird, die hier, also bei addEventListener() angegeben wurde. Soweit hast Du Recht. Was ich meinte, war, dass diese Funktion, eben weil sie das Interface EventListener implementiert, automatisch das Event als Parameter übergeben bekommt, weil sie praktisch die Methode handleEvent(e) überschreibt.

Im Folgenden setze ich das Element mit der ID "id" als vorhanden voraus.

Der Versuch des OPs, den EventListener zu implementieren:

function meldung(link) {
         alert("Gedrückt: " +link);
}//Meldung

getElem("id", array[i], "null").addEventListener("click", meldung(getElem("id", array[i], "null").getAttribute('id')), true);

muss also scheitern.

Der richtige[TM] ;-)) Weg, mit dem DOM-Eventhandling zu arbeiten wäre also:

function meldung(evt) {
         alert("Gedrückt: " + evt.target.id);
}//Meldung

getElem("id", array[i], "null").addEventListener("click", meldung, true);

Das wollte ich zeigen.

Da dies vom IE allerdings _gar nicht_ umgesetzt wird, schlug ich etwas anders vor.

Dass man als EventListener natürlich auch eine Funktion mit Parameter übergeben kann, etwa so:

function meldung(elem) {
         alert("Gedrückt: " + elem.id);
}//Meldung

getElem("id", array[i], "null").addEventListener("click", function() {meldung(this);}, true);

ist natürlich richtig. Allerdings ist das dann _nicht_ mehr DOM-Eventhandling.

viele Grüße

Axel