Moin,
Mit NN7 geht es, sogar gut, obwohl ich es nicht ganz verstehe.
Wie gesagt, das ist reines, wunderschönes DOM.
Mit IE kommt nichts.
Ja, der kann DOM nicht vernünftig, zumindest nicht den Event-Teil aus DOM2. Prinzipiell geht vieles von den DOM-Events auch mit dem IE, bloß heissen die Eigenschaften da (scheinbar konsequent) anders. Da ich keinen IE zum Testen habe, kann ich auch kein Erfolgsrezept geben. (Das letzte mal als ich ein schönes DOM-kompatibles Skript so verbiegen musste, dass es auch im IE klappt, habe ich auch schon genug geflucht.)
Selfhtml kann mir aber nichts über currentTarget sagen, das mit dem addEventListener hab ich auch wo anders her.
In Selfhtml sind DOM-Events glaube ich auch noch gar nicht drin. Das steht aber alles in der W3C-Spezifikation unter http://www.w3.org/TR/DOM-Level-2-Events/
Aber ich möchte auch ein paar mal fremde divs damit ansprechen.
"fremde divs"?
Ich habe Scripts gesehen wo das geht, aber die sind so kompliziert, das ich da nichts rauslesen kann.
Ja, das berücksichtigt gleich mehrere Browser. Ich habe vor einiger Zeit ein komplexeres Skript für DOM, NN4, IE4 und IE 5/6 (die wollen alle extra berücksichtigt werden) aufgebohrt und wollte dazu eigentlich auch einen Feature-Artikel schreiben (zu 20% fertig), hatte dann aber keine Zeit mehr.
Ich habe eben noch mal gegooglet und einen Vergleich gefunden: http://www.javascriptkit.com/dhtmltutors/domeventp2-1.shtml. Da steht, dass IE gar kein Äquivalent zu currentTarget kennt, also ist wohl mal wieder die Zeit der dreckigen Workarounds gekommen.
Also (tieflufthohl): Der IE kennt srcElement (das Äquivalent zu target) und das enthält eine Referenz auf das Element an das das Event eigentlich gerichtet ist. Das ist leider nicht notwendigerweise das Element, dass du haben willst (falls doch kannst du jetzt aufhören diesen Absatz zu lesen ;). Wenn du also deinen Event-Handler bei <div><img>bla</div> auf das div ansetzt und jemand auf das Bild (statt auf den Text daneben) klickt, dann ist eine Referenz auf das img-Objekt in srcElement bzw. target. Glücklicherweise kennt der IE die Eigenschaft parentElement die jedes HTML-Element-Objekt hat (die korrespondierende DOM-Eigenschaft heisst übrigens parentNode) und die das jeweilige Elternelement enthält. Du musst dann nur noch die Objektkette bis nach oben durchklettern und schauen ob da ein Objekt bei ist, dass dir gefällt. Das entscheidest du entweder, indem du irgendwo eine Liste mit den IDs der interessanten Elemente hast oder indem du bei der Benennung irgendein Schema benutzt, also <div id="hallo1"> .. <div id="hallo2"> .. und dann mit indexOf() auf die id-Eigenschaft der jeweiligen Kandidaten losgehst (alternativ kannst du auch einen festen Wert für das name-Attribut verwenden, der darf bei mehreren Elementen gleich sein).
(BTW: Wenn du dieses Schema gleich anwendest, brauchst du unter Umständen nur einen Event-Listener bzw. Handler für das body-Element zu definieren und kannst dann das Skript ohne Änderung am JS-Code auf mehreren Seiten einsetzen. Das ist das Prinzip das du bei den meisten Beispielen finden wirst, deswegen sind die häufig auch übermäßig kompliziert.)
So, um die trockene Theorie mal etwas aufzulockern hier noch ein einfaches Beispiel in Form einer modifizierten function auf(). Der Rest müsste gleich bleiben können:
function auf(ev){
if(!ev) ev = window.event; // Ja, der IE braucht das definitiv
div = ev.currentTarget; // DOM-Kompatibel
if(!div) { // Spaß
div = ev.srcElement; // Das ursprüngliche Ziel des Events
while( div.id.indexOf("aufmachbar") != -1 // Abbruch, wenn die ID "aufmachbar" enthält ...
&& div.parentElement) // ... oder es keine weiteren Eltern gibt
div = div.parentElement;
if(div.id.indexOf("aufmachbar") != -1) return; // Nix gefunden
}
// In div liegt jetzt das div-Objekt auf das das Ereignis ausgeführt wurde
}
(Der Code ist mangels IE ungetestet, sollte aber selbst wenn er nicht funktioniert das Prinzip illustrieren.)
Und in deiner Seite hast du dann
<div id="aufmachbar1"> bla </div> <div id="aufmachbar2"> blu </div>
oder ähnliches.
HTH
--
Henryk Plötz
Grüße aus Berlin