Mit doc.writeln erzeugte iframes und deren Inhalt
Thilo
- dhtml
Hallo,
ich habe folgendes Problem: ich arbeite an einer HTML-Seite, deren eigentlicher Inhalt komplett per document.writeln() erzeugt wird. Im speziellen gehts um einen iframe, dessen Inhalt ich auch erst noch generiere. Das sieht ungefähr so aus (stilisiert):
document.writeln( '<html><body><iframe id="myiframe"></iframe></body></html>' );
Danach generiere ich den gewünschten Content des iframes als HTML-Code in eine String-Variable. Der iframe enthält eine Tabelle mit irgendwelchen Zeilen, Zellen und Zelleninhalten (nicht statisch):
var iframeContent = '<html><body><table id="mytable"><tr><td>Hallo Welt!</td></tr></table></body><html>';
Dann hole ich mir eine Referenz auf den soeben erzeugten iframe:
var myIFrame = eval( 'parent.myiframe' );
Dann schreibe ich den Content in den iframe (ich verwende also keine weitere HTML-Datei)
myIFrame.document.writeln( iframeContent );
Danach muß ich die Größe des iframes an seinen Inhalt anpassen, d.h., ich hole mir eine referenz auf die Tabelle im iframe-Content:
var myTable = myIFrame.document.getElementById( 'mytable' );
...und versuche dann, die offsetWidth- und offsetHeight-Werte der Tabelle auszulesen und sie den Width- und Height-Styles des iframes zu setzen:
myIFrame.style.width = myTable.offsetWidth;
myIFrame.style.height = myTable.offsetHeight;
So. Das funktioniert im IE tadellos. Unter NN7.1 bekomme ich bei den Zeilen, in denen ich mir die Referenzen auf iframe oder Tabelle hole, bzw. beim Zugriff auf deren Properties, Fehlermeldungen wie z.B. "hat keine Properties" oder schlicht "gibts nich" (sinngemäß natürlich ;). Interessant ist allerdings, daß, wenn ich in jede zweite Zeile ein "alert();" setze und die NN-JS-Engine damit "ausbremse", das ganze zumindest teilweise funktioniert (bis dann an anderer Stelle ähnliche Fehler auftreten). Ich folgere aus diesem Verhalten, daß unter NN7.1 mit document.writeln() erzeugte Elemente erst dann wirklich zu existieren beginnen, wenn das Skript komplett durchgelaufen ist, oder wenn so was wie eine alert()-Box für eine Unterbrechung sorgt.
Ehrlich gesagt bin ich total ratlos, wie ich das lösen könnte, und kann deswegen auch keine sehr konkreten Fragen stellen. Meine momentane Hoffnung besteht darin, den Effekt der alerts auch irgendwie ohne alerts zu erreichen. ???
Ich bedanke mich im Voraus für eure Zeit, Ideen, Vorschläge und Flames :)
Thilo
Hallo,
ich habe folgendes Problem: ich arbeite an einer HTML-Seite, deren eigentlicher Inhalt komplett per document.writeln() erzeugt wird. Im speziellen gehts um einen iframe, dessen Inhalt ich auch erst noch generiere. Das sieht ungefähr so aus (stilisiert):
Das ist ja hart, warum machst du das so?
Mal abgesehen, dass es für keinen, nicht mal dich einen nutzen hat.
Und wenn du es so machen mußt (was ich mir nicht vorstellen kann), dann verwende Frames in die du den Inhalt reinschreibst, aber nicht das gleiche Dokument in dem auch dein JS ist, da du damit das Skript überschreibst.
document.writeln( '<html><body><iframe id="myiframe"></iframe></body></html>' );
Warum nicht einfach:
<html>
<body>
<iframe id="myiframe"></iframe>
</body></html>
var myIFrame = eval( 'parent.myiframe' );
selten eine überflüssige verwendung von eval gesehen.
eval ist evil und wie immer auch hier absolut nicht nötig:
var myIFrame = parent.myiframe;
Dann schreibe ich den Content in den iframe (ich verwende also keine weitere HTML-Datei)
myIFrame.document.writeln( iframeContent );
im zweifelsfall lieber:
myIFrame.innerHTML = ...
Danach muß ich die Größe des iframes an seinen Inhalt anpassen, d.h., ich hole mir eine referenz auf die Tabelle im iframe-Content:
var myTable = myIFrame.document.getElementById( 'mytable' );
Ohne zu Wissen, das das Dokument schon fertig gerendert ist wirst du hier imer schwierigkeiten bekommen.
Da das onload event bei dynamischen Dokumenten nicht feuert, musst du eine Schleife mit setTimeout machen, die immer wieder überprüft ob das was du suchst wirklich vorhanden ist.
BTW, document.writeln ist verpöhnt nimm document.write()
(wobei das eher historische Gründe hatte, da einige Mac Browser, damit Abstürze verursachten)
Struppi.
Hallo und Danke für die Antwort,
Das ist ja hart, warum machst du das so?
Mal abgesehen, dass es für keinen, nicht mal dich einen nutzen hat.
Der Hintergrund ist, daß ich aus einem XML, welches die Daten für eine beliebig tiefe hierarchische Menüstruktur enthält, via XSLT eine gigantisches hierarchisch verschachteltes JS-Array mache. Daraus erzeugt mein JS-Code ein klassisches PopDown-Menü. Ursprünglich habe ich mit Divs für die aufpoppenden Menu-Fenster gearbeitet, das Problem war, daß DropDown-Boxen und z.B. Flash-Plugins sich nicht um den Z-Index kümmern und *immer* obenauf erscheinen. Abhilfe bieten da nur absolut positionierte IFrames.
Und wenn du es so machen mußt (was ich mir nicht vorstellen kann), dann verwende Frames in die du den Inhalt reinschreibst, aber nicht das gleiche Dokument in dem auch dein JS ist, da du damit das Skript überschreibst.
Ich muß IFrames benutzen, damit ich die Dinger absolut positionieren kann (ich kann da schlecht mit nem Frameset arbeiten ;).
Warum nicht einfach:
<html>
<body>
<iframe id="myiframe"></iframe>
</body></html>
<html> und <body> habe ich nur aus Beispielgründen hier aufgenommen. Tatsache ist allerdings, daß ich die IFrames dynamisch generieren muß.
selten eine überflüssige verwendung von eval gesehen.
eval ist evil und wie immer auch hier absolut nicht nötig:
var myIFrame = parent.myiframe;
Hmmm, ok danke, das ist eh nur nuch ein Artefakt von irgendwelchen verzweifelten Versuchen.
im zweifelsfall lieber:
myIFrame.innerHTML = ...
Hmm, ich bin zwar ein HTML-Noob, aber ich glaube (und ich glaube, daß ich das auch ausprobiert habe), daß sich innerHTML auf den Text zwischen öffnendem und schließendem IFrame-Tag bezieht. Das resultiert aber dann nur in einem Alternativ-Text, der angezeigt wird, wenn der Browser keine IFrames kann. Der Inhalt des IFrames MUß per src-Attribut oder per frame.doc.write angegeben werden.
Ohne zu Wissen, das das Dokument schon fertig gerendert ist wirst du hier imer schwierigkeiten bekommen.
Da das onload event bei dynamischen Dokumenten nicht feuert, musst du eine Schleife mit setTimeout machen, die immer wieder überprüft ob das was du suchst wirklich vorhanden ist.
*arg* das klingt nach problemorientierter Programmierung... ;)
BTW, document.writeln ist verpöhnt nimm document.write()
(wobei das eher historische Gründe hatte, da einige Mac Browser, damit Abstürze verursachten)
*g* verstehe. Nehm's mir zu Herzen ;)
Thilo