PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Javascript/DOM - IE6 ignoriert erstellten Event


ezzemm
2008-08-29, 12:32:56
Hallo zusammen!

Ich versuche gerade ein kleines Lightbox-Script zu programmieren. Hierzu erstelle ich mittels DOM mehrere Objekte, die ich dann dem <body> als childNode anhänge. Die Funktion die die LightBox aufruft funktioniert auch schon wunderbar. Nur sollte ich sie ja auch wieder schließen können.
Daher lasse ich von der Aufruf-Funktion einen onclick-Event erstellen, der dann eine weitere Funktion aufruft.

Im Firefox funktionierts wunderbar, im IE6 aber leider nicht. Und das obwohl der DOM-Inspector der IEDevToolbar anzeigt, dass das onclick-Attribut korrekt erstellt wurde. Der IE6 reagiert aber trotzdem nicht.
Hat jemand eine Idee woran es liegen könnte?

var a = document.createElement("a");
a.setAttribute("href","#");
a.setAttribute("onclick", "alert('hi')");

Sephiroth
2008-08-29, 14:12:29
Versuch ob es geht, wenn du das neue Element erst in die DOM-Struktur hinzufügst und dann über addEventListener bzw. attachEvent einen event listener für den click event registrierst.

Marscel
2008-08-29, 15:21:43
a.onclick = new Function("function blub() { ...; }");

DanMan
2008-08-29, 17:18:08
Das Element, was du da erstellt hast gibt's im DOM noch nicht. Musst du noch einhängen, entweder mit addChild oder insertBefore.

http://developer.mozilla.org/en/DOM/document.createElement

Darum gibts übrigends fertige Lightbox Scripts - damit man sich nicht mehr drum kümmern muss, sondern es einfach funktioniert.

ezzemm
2008-09-01, 13:41:48
Hallo und danke für die Hilfe; ich habe es dank euch hinbekommen.

Versuch ob es geht, wenn du das neue Element erst in die DOM-Struktur hinzufügst und dann über addEventListener bzw. attachEvent einen event listener für den click event registrierst.
Ich habe es mit addEventListener probiert. Im Firefox hat das dann auch geklappt. Der IE6 allerdings hat nicht nur nichts angezeigt, sondern hat eine Fehlermeldung gebracht daß er das Element nicht kennt.

a.onclick = new Function("function blub() { ...; }");
So habe ich das dann realisiert. Allerdings ist die schreibweise ein bischen anders:
a.onclick = function close() {
alert("foo");
}

Das Element, was du da erstellt hast gibt's im DOM noch nicht. Musst du noch einhängen, entweder mit addChild oder insertBefore.

http://developer.mozilla.org/en/DOM/document.createElement

Wie genau meinst du das? Ich habe <a> ja erst erstellt und dann das Atrribut eingefügt. Oder meinst du was grundlegend anderes?

Darum gibts übrigends fertige Lightbox Scripts - damit man sich nicht mehr drum kümmern muss, sondern es einfach funktioniert.
Wenn man bestehende Scripte einbaut lernt man aber nichts dabei ;)
Vor allem brauche ich aber eine Lightbox die wenig HTML-Code benötigt und zum anderen keine Stylesheet- oder Bilddateien. Es ist für das Intranet bei mir in der Firma, und da kann ich die Dateien nicht via FTP hochladen sondern nur jede Datei einzeln via Formular.


Wer Interesse am Script hat dem poste ich es hier. An die Profis: Ich würde mich freuen über Hinweise wie ich es eleganter Programmieren kann. Bin ja noch Anfänger :)


HTML-Code:
<a name="bildname.jpg" href="#" onclick="LightBox(this)">Linkname</a>

JS-Code:
function LightBox(param) {
var opacity = 80; // Transparenz des Hintergrunds
var gap = 20; // Mindestbreite des transparenten Rahmens um das Bild (in px)

var img = new Image();
img.src = param.name;
var ratio = img.height / img.width;
var imgX, imgY, resize;
if (img.width + gap >= document.body.clientWidth) { // Skalierung falls Bild zu breit
imgX = document.body.clientWidth - gap;
imgY = imgX * ratio;
img.style.width = imgX;
img.style.height = imgY;
resize = true;
} else if (img.height + gap >= document.body.clientHeight) { // Skalierung falls Bild zu hoch
imgY = document.body.clientHeight - gap;
imgX = imgY / ratio;
img.style.width = imgX;
img.style.height = imgY;
resize = true;
} else {
imgX = img.width;
imgY = img.height;
img.style.width = imgX;
img.style.height = imgY;
resize = false;
}

var body = document.getElementsByTagName("body");
var backLayer = document.createElement("div"); // <div>-Layer: Transparenter Hintergrund
backLayer.style.position = "absolute";
backLayer.style.top = "0px";
backLayer.style.left = "0px";
backLayer.style.width = document.body.clientWidth+"px";
backLayer.style.height = document.body.clientHeight+"px";
backLayer.style.backgroundColor = "black";
if ((document.all) && (document.getElementById)) { // Kontrolle auf IE6
backLayer.style.filter = "alpha(opacity=" + opacity + ")";
} else if ((!document.all) && (document.getElementById)) { // Kontrolle auf Firefox
backLayer.style.opacity = opacity/100;
}
var frontLayer = document.createElement("div"); // <div>-Layer: zentrierter Vordergrund
frontLayer.style.position = "absolute";
frontLayer.style.left = (document.body.clientWidth - imgX) / 2;
frontLayer.style.top = (document.body.clientHeight - imgY) / 2;
frontLayer.style.cursor = "pointer";
var a = document.createElement("a"); // Link der das Bild wieder schließt...
if (resize) {
a.onclick = function close() { // ... wenn es skaliert wurde
body[0].removeChild(body[0].lastChild);
body[0].removeChild(body[0].lastChild);
document.location.href = param.name;
}
} else {
a.onclick = function close() { // ... wenn es nicht skaliert wurde
body[0].removeChild(body[0].lastChild);
body[0].removeChild(body[0].lastChild);
}
}
a.appendChild(img);
frontLayer.appendChild(a);
body[0].appendChild(backLayer);
body[0].appendChild(frontLayer);
}