Verwaltung d. Eventhandler bei DOM-fähigen IEs
Christopher Reimann
- javascript
Liebe Leute!
Ich habe ein dummes Problem mit der Browserkompatibilität. Und zwar habe ich ein Script für das dynamische Erzeugen eines Menüs erstellt, das seine Einträge aus einem Array liest und für jeden Eintrag ein Div-Element erstellt. Jetzt habe ich für den NN die Fkt AddEventListener verwenden können, stehe beim IE allerdings auf dem Schlauch.
Es soll dem Div-Element ein onmouseover -und out eventhandler hinzugefügt werden. Versucht habe ich, outerHTML verändern und mit attachEvent dasselbe wie mit AddEventListener zu erreichen. Allerdings komme ich dann nicht mehr auf das eigens erstellte Attribut nr, das als ich Parameter bräuchte (diese lassen sich ja nicht übergeben).
Ich hoffe, es gibt genügend erfahrenere Programmierer, die mir Aushilfe schaffen, Danke!
Tag Christopher.
Es soll dem Div-Element ein onmouseover -und out eventhandler hinzugefügt werden. Versucht habe ich, outerHTML verändern und mit attachEvent dasselbe wie mit AddEventListener zu erreichen. Allerdings komme ich dann nicht mehr auf das eigens erstellte Attribut nr, das als ich Parameter bräuchte (diese lassen sich ja nicht übergeben).
Hm, irgendwie verstehe ich nicht, wieso du hier outerHTML vewenden willst, oder ich verstehe dein Problem nicht. Folgender vereinfachter Code funktioniert hier im IE6 prächtig:
<html>
<head>
<title>Demo: attachEvent</title>
<script type="text/javascript" language="JScript">
<!--
function AddEventTo() {
var obj = document.getElementById("test");
obj.attachEvent('onmouseover',foo);
obj.attachEvent('onmouseout',bar);
}
function foo() {
alert("Maus drüber");
}
function bar() {
alert("Und wieder wech");
}
-->
</script>
</head>
<body onload="AddEventTo()">
<div id="test" style="border:1px solid black">
<p>Test-Div</p>
</div>
</body>
</html>
Siehe auch MSDN: attachEvent.
[dsf 3.6]
Siechfred
Okay, versuche ich, mit attachEvent zu arbeiten, kann ich keinen Parameter übergeben. Da das mit AddEventListener dasgleiche ist, habe ich ein Attribut nr für das Element erstellt. Diese Nummer wird in einer "Überbrückungsfkt" an die eigentliche weitergeben. Bei NN komme ich mit this.nr dran, beim IE weiß ich allerdings nicht, wie ich an dieses Attribut komme.
Danke für die Hilfe!
Christopher
Tag Christopher.
Okay, versuche ich, mit attachEvent zu arbeiten, kann ich keinen Parameter übergeben.
An wen oder was willst du einen Parameter übergeben? An die referenzierte Funktion?
Da das mit AddEventListener dasgleiche ist, habe ich ein Attribut nr für das Element erstellt. Diese Nummer wird in einer "Überbrückungsfkt" an die eigentliche weitergeben. Bei NN komme ich mit this.nr dran, beim IE weiß ich allerdings nicht, wie ich an dieses Attribut komme.
Irgendwie weiß ich noch nicht so recht, was du erreichen willst, wie wäre es also mit ein bisschen Quellcode?
[dsf 3.6]
Siechfred
Hallo Christopher,
es geht aus deinem Posting nicht wirklich hervor, wo das Problem liegt. Meine Crossbrowser-Funktion für die Eventregistrierung sieht folgendermaßen aus:
function TMErstelleEvent(obj,handler,funktion,bubble) {
var obj = TMSucheElem(obj);
if (obj.addEventListener) { // DOM2 Eventhandling
return obj.addEventListener(handler,funktion,bubble);
} else if (obj.attachEvent) { // IE Eventhandling
return obj.attachEvent('on' + handler,funktion);
} else { // Altes Eventhandling
return obj['on' + handler] = funktion;
}
}
//Beispielaufruf:
TMErstelleEvent(document,'mouseover',eineFunktionsReferenz,false)
Vielleicht hilft dir das ja weiter?
MfG, Mülli
Hallo,
function TMErstelleEvent(obj,handler,funktion,bubble) {
...
return obj.addEventListener(handler,funktion,bubble);
...
}//Beispielaufruf:
TMErstelleEvent(document,'mouseover',eineFunktionsReferenz,false)
Nur eine formale Anmerkung:
Vermutlich setzt die Funktion das Gewuenschte richtig um, aber *bubble* beißt sich von seiner Bedeutung her mit *false*, weil addEventListener() mit drittem Parameter false gerade die Bubble-Phase von Ereignissen belauscht und true fuer die Capture-Phase steht.
Insofern sollte der Parameter bubble vielleicht besser capture heißen.
MfG, Thomas
Hallo Thomas,
Nur eine formale Anmerkung:
Vermutlich setzt die Funktion das Gewuenschte richtig um, aber *bubble* beißt sich von seiner Bedeutung her mit *false*, weil addEventListener() mit drittem Parameter false gerade die Bubble-Phase von Ereignissen belauscht und true fuer die Capture-Phase steht.
Insofern sollte der Parameter bubble vielleicht besser capture heißen.
Da hast du natürlich recht. In der "Original"-Version hat die Funktion allerdings gar keine vordefinierten Parameter, stattdessen verwende ich dort "arguments". Um das ganze für das Forum ein bisschen übersichtlicher zu machen, habe ich dann eben (leicht stümperhaft) ein paar Parameter aus dem Ärmel geschüttelt. Im Normalfall vermeide ich es auch, innerhalb einer Funktion bei Variablen/Parametern Deutsch und Englisch zu vermischen, was mir in diesem Fall ja auch nicht gelungen ist. ;-)
MfG, Mülli