document.open in onreadystatechange funktioniert nicht im IE
hesst
- javascript
Hallo,
ich versuche in onreadystatechange die Funktion document.open() aufzurufen. Das gelingt mir auch in allen Browsern, nur nicht im IE.
hier sind mal die stark vereinfachten Dateien. Ich bin für jeden Tip dankbar.
xxx.html:
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
<html>
<head>
<title>xxx</title>
<script type="text/javascript" src="xxx.js"></script>
</head>
<body onLoad="">
<script language="JavaScript">
<!--
xxx(fff);
//-->
</script>
</body>
</html>
xxx.js:
function fff()
{
try
{
document.open();
document.close();
// hier will ich hin
alert('reach my goal');
}
catch(e)
{
alert('Your browser can't handle this script');
}
}
function xxx(func)
{
// fff(); // hier gehts
var xmlHttpRequest = null;
try
{
xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert('Your browser can't handle this script');
return;
}
}
xmlHttpRequest.open("GET", "xxx.xml", true);
xmlHttpRequest.onreadystatechange = function()
{
if (xmlHttpRequest.readyState == 4
&& (xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0))
{
var root = xmlHttpRequest.responseXML.documentElement;
if (xmlHttpRequest.responseXML.documentElement != null)
{
func();
}
}
}
xmlHttpRequest.send(null);
}
xxx.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xxx>
</xxx>
Yerf!
ich versuche in onreadystatechange die Funktion document.open() aufzurufen. Das gelingt mir auch in allen Browsern, nur nicht im IE.
Etwas mehr Fehlerbeschreibung wär nicht schlecht... gibts ne Fehlermeldung oder was genau passiert?
xmlHttpRequest.open("GET", "xxx.xml", true);
xmlHttpRequest.onreadystatechange = function()
Hm, macht man das normalerweise nicht umgekehrt, also erst Eventhandler zuweisen und dann den Open?
Gruß,
Harlequin
Hi,
Etwas mehr Fehlerbeschreibung wär nicht schlecht... gibts ne Fehlermeldung oder was genau passiert?
Es kommt nichts, er macht einfach nicht weiter, keine Exception, kein Fehler.
Hm, macht man das normalerweise nicht umgekehrt, also erst Eventhandler zuweisen und dann den Open?
Der Eventhandler wird schon gerufen, nur kann ich dort document.open nicht aufrufen.
Gruß, hesst
Yerf!
Es kommt nichts, er macht einfach nicht weiter, keine Exception, kein Fehler.
Der Eventhandler wird schon gerufen, nur kann ich dort document.open nicht aufrufen.
Hm... das widerspricht sich jetzt ein wenig... Wenn der Eventhandler gerufen wird muss doch zumindest einer der Alerts kommen, oder?
Gruß,
Harlequin
Hi
Hm... das widerspricht sich jetzt ein wenig... Wenn der Eventhandler gerufen wird muss doch zumindest einer der Alerts kommen, oder?
Das ist es ja gerade, es kommt kein Alert, das document.open kann ich aber noch debuggen.
Hi,
ich versuche in onreadystatechange die Funktion document.open() aufzurufen. Das gelingt mir auch in allen Browsern, nur nicht im IE.
Es wundert mich, daß das überhaupt in irgendeinem Browser funktionieren soll.
open() löscht das aktuelle Dokument - inkl. dem JS-Code darin.
Gruß, Cybaer
Hi,
open() löscht das aktuelle Dokument - inkl. dem JS-Code darin.
dann dürfte das Bsp. auf http://de.selfhtml.org/javascript/objekte/document.htm#open auch nicht funktionieren. Wenn ich in meiner Funktion xxx die Funktion fff direkt aufrufe, funktioniert auch alles.
Gruß, hesst
Hi,
dann dürfte das Bsp. auf http://de.selfhtml.org/javascript/objekte/document.htm#open auch nicht funktionieren. Wenn ich in meiner Funktion xxx die Funktion fff direkt aufrufe, funktioniert auch alles.
Die Beispiele sind allerdings nicht identisch. Du schließt das neue Dokument ja sofort wieder und signalisiert damit: (Lade-)Ende des neuen Dokuments erreicht - ich bin fertig.
Gruß, Cybaer
Hi,
Die Beispiele sind allerdings nicht identisch. Du schließt das neue Dokument ja sofort wieder und signalisiert damit: (Lade-)Ende des neuen Dokuments erreicht - ich bin fertig.
Ist es nicht egal, ob ich es gleich wieder schließe, oder nicht? Egal, in der Endfassung will ich natürlich schon eine Seite zw. open und close aufbauen. Das gelingt aber leider nicht, weil er nach document.open nichts mehr macht.
Gruß, hesst
Hi,
Ist es nicht egal, ob ich es gleich wieder schließe, oder nicht?
Nochmal: Verzichte auf open() ganz, und dein Problem ist gelöst.
Nimm stattdessen DOM-Methoden um Daten auszugeben ...
... oder laß es, und überleg weiter, woran es liegen könnte. =:-o
Gruß, Cybaer
PS: Nicht, daß ich mich nie irren würde. Aber ich bin hier nicht derjenige, der ein Problem hat. Und wenn Du es besser weißt, warum bittest Du dann andere überhaupt um Hilfe?
Yerf!
Nochmal: Verzichte auf open() ganz, und dein Problem ist gelöst.
Auch wenn mir selbst nicht ganz klar ist, weshalb es in diesem Fall mit open() Probleme geben könnte, so muss ich hier trotzdem zustimmen. Wozu erst mittels Ajax einen asynchronen Request im Hintergrund durchführen, wenn man dann eh die komplette Seite wegwirft und neu aufbaut? Das erledigt ein <a href="..."> doch viel eleganter...
Gruß,
Harlequin
Hi,
@Cybaer
Nochmal: Verzichte auf open() ganz, und dein Problem ist gelöst.
Das ist wohl war, nur muß es doch auch über open, write, close gehen, bzw. geht es das auch lokal mit IE, Mozilla, Opera, Safari und auf dem Server mit Mozilla, Opera.
Warum soll es mit open nicht gehen?
PS: Nicht, daß ich mich nie irren würde. Aber ich bin hier nicht derjenige, der ein Problem hat. Und wenn Du es besser weißt, warum bittest Du dann andere überhaupt um Hilfe?
Sage ich es mal anders, ich hätte gerne eine Lösung für das Open-Problem und nicht als Lösung auf open zu verzichten.
@Harlequin
Wozu erst mittels Ajax einen asynchronen Request im Hintergrund durchführen, wenn man dann eh die komplette Seite wegwirft und neu aufbaut?
Der asynchrone Request ist eigentlich nur reingekommen, da xmlDoc.load(xmlFile); nur von einigen Browsern unterstützt wird.
// so war es mal
// Die Fkt. view ist die funktion mit dem besagten open
function show(xmlFile)
{
if (document.implementation && document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.async = false;
}
else if (window.ActiveXObject)
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
}
else
{
alert('Your browser can't handle this script');
return;
}
xmlDoc.load(xmlFile);
var root = xmlDoc.documentElement;
view(root, xmlFile);
}
// so ist es jetzt
// Die Fkt. view übergebe ich als func
function loadXML(strFileName, func, param)
{
var xmlHttpRequest = null;
var client = new clientProperties();
if (window.XMLHttpRequest && !client.isIE7)
{
xmlHttpRequest = new XMLHttpRequest();
if (xmlHttpRequest.overrideMimeType)
{
xmlHttpRequest.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject)
{
try
{
xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert('Your browser can't handle this script');
return;
}
}
}
xmlHttpRequest.open("GET", strFileName, true);
xmlHttpRequest.onreadystatechange = function()
{
if (xmlHttpRequest.readyState == 4
&& (xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0))
{
if (xmlHttpRequest.responseXML == null)
{
if (xmlHttpRequest.status != 0)
{
loadDOM(strFileName, func, param);
}
}
else if (xmlHttpRequest.responseXML.documentElement == null)
{
if (xmlHttpRequest.status != 0)
{
loadDOM(strFileName, func, param);
}
else
{
// Local failure, try using DOM to load
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlHttpRequest.responseText);
var root = xmlDoc.documentElement;
if (xmlDoc.documentElement != null)
{
func(root, param);
}
else
{
loadDOM(strFileName, func, param);
}
}
}
else
{
var root = xmlHttpRequest.responseXML.documentElement;
if (xmlHttpRequest.responseXML.documentElement != null)
{
func(root, param);
}
else
{
loadDOM(strFileName, func, param);
}
}
}
}
xmlHttpRequest.send(null);
}
function loadDOM(strFileName, func, param)
{
if (document.implementation && document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.async = false;
}
else if (window.ActiveXObject)
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
}
else
{
alert('Your browser can't handle this script');
return;
}
xmlDoc.load(strFileName);
var root = xmlDoc.documentElement;
func(root, param);
}
Hi,
Nochmal: Verzichte auf open() ganz, und dein Problem ist gelöst.
Das ist wohl war, nur muß es doch auch über open, write, close gehen, bzw. geht es das auch lokal mit IE, Mozilla, Opera, Safari und auf dem Server mit Mozilla, Opera.
Warum soll es mit open nicht gehen?
Weil der IE mal wieder anders reagiert, als andere Browser.
Ist nicht neu, diese Erkenntnis.
Sage ich es mal anders, ich hätte gerne eine Lösung für das Open-Problem und nicht als Lösung auf open zu verzichten.
Fein, aber auf das Unmögliche zu bestehen ist sicherlich ehrenwert, aber weitgehend sinnfrei. Zumal wenn eine (ohnehin bessere) Alternative besteht.
Der asynchrone Request ist eigentlich nur reingekommen, da xmlDoc.load(xmlFile); nur von einigen Browsern unterstützt wird.
Wozu denn load()? Hole halt die XML-Resource wie gehabt, nur eben nicht asynchron sondern synchron.
Gruß, Cybaer
Hi,
Fein, aber auf das Unmögliche zu bestehen ist sicherlich ehrenwert, aber weitgehend sinnfrei. Zumal wenn eine (ohnehin bessere) Alternative besteht.
So unmöglich scheint es aber nicht zu sein, sonst würde es prinzipiell im IE nicht gehen, und lokal schon gar nicht. Wenn du weißt, warum es hier im speziellen nicht läuft, nur raus damit, aber es geht nicht weil es nicht geht, hilft mir nicht weiter.
Wozu denn load()? Hole halt die XML-Resource wie gehabt, nur eben nicht asynchron sondern synchron.
Weil auch synchron nur in einer Server/Client-Umgebung richtig funktioniert und lokal halt nicht.
Gruß hesst
Hi,
So unmöglich scheint es aber nicht zu sein, sonst würde es prinzipiell im IE nicht gehen, und lokal schon gar nicht. Wenn du weißt, warum es hier im speziellen nicht läuft, nur raus damit, aber es geht nicht weil es nicht geht, hilft mir nicht weiter.
Ich weiß es, ich habe es dir gesagt. Dein Script, dein Problem, ich kann es so schreiben, daß es funktioniert. Glaub es, glaub es nicht oder gib von mir aus auch den Don Quichote. :)
Weil auch synchron nur in einer Server/Client-Umgebung richtig funktioniert und lokal halt nicht.
Dann setz halt einen lokalen Webserver auf, oder mach eine Fallunterscheidung.
Gruß, Cybaer
Zu erwähnen ist noch, das in der vollständigen onreadystatechange noch ein Fallback für den Fall, daß es lokal läuft enthalten ist. Dann geht's auch im IE (lokal).
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlHttpRequest.responseText);
var root = xmlDoc.documentElement;
if (xmlDoc.documentElement != null)
{
func();
}
Gruß, hesst
ich versuche in onreadystatechange die Funktion document.open() aufzurufen. Das gelingt mir auch in allen Browsern, nur nicht im IE.
hier sind mal die stark vereinfachten Dateien. Ich bin für jeden Tip dankbar.
Dein Beispiel funktioniert bei mir im IE 6 ohne Probleme.
Struppi.
Hi,
Dein Beispiel funktioniert bei mir im IE 6 ohne Probleme.
Hmm, ich habe das kleine Bsp. jetzt zwar nur im IE7 getestet, aber die komplette Version geht bei mir im IE6 nicht.
Ich werde mir morgen mal ein IE6 suchen und das Beispiel probieren.
Danke für deinen Tip.
Gruß hesst
Hi,
Dein Beispiel funktioniert bei mir im IE 6 ohne Probleme.
Hmm, ich habe das kleine Bsp. jetzt zwar nur im IE7 getestet, aber die komplette Version geht bei mir im IE6 nicht.
Ich werde mir morgen mal ein IE6 suchen und das Beispiel probieren.
Ach, und als Ergänzung: funktieren tut es über localhost, wenn ich es mit dem file:// Protokoll aufrufe, wird die Bedingung nicht erfüllt:
if (xmlHttpRequest.responseXML.documentElement != null)
Aber das Problem liegt nicht am document.open()
Struppi.
Hi,
Ach, und als Ergänzung: funktieren tut es über localhost, wenn ich es mit dem file:// Protokoll aufrufe, wird die Bedingung nicht erfüllt:
if (xmlHttpRequest.responseXML.documentElement != null)
was meinst du mit localhost? Ein Http-Server auf localhost oder lokal ohne Server über file:// geöffnet? Das letztere geht bei mir überall. Nur über Http-Server gibts Probleme. Ein Http-Server auf localhost kann ich erst morgen testen aber einen im Intranet geht auch im IE6 bei mir nicht.
Aber das Problem liegt nicht am document.open()
Sondern? Oder wie kommst du darauf?
Gruß hesst
Ach, und als Ergänzung: funktieren tut es über localhost, wenn ich es mit dem file:// Protokoll aufrufe, wird die Bedingung nicht erfüllt:
if (xmlHttpRequest.responseXML.documentElement != null)
was meinst du mit localhost? Ein Http-Server auf localhost oder lokal ohne Server über file:// geöffnet? Das letztere geht bei mir überall.
Das letzter geht bei mir nicht ohne Änderungen am Code. Ja, mit localhost meine ich einen lokalen Server.
Aber das Problem liegt nicht am document.open()
Sondern? Oder wie kommst du darauf?
Wenn ich die obige Abfrage weglasse, funktioniert dein Beispiel immer.
Struppi.
Hi,
Wenn ich die obige Abfrage weglasse, funktioniert dein Beispiel immer.
Das ist interessant, was hast du denn für eine Version? Die Abfrage kann weg, die ist nur in der vollständigen Version von Bedeutung.
Gruß hesst
Hi,
Aber das Problem liegt nicht am document.open()
Das sehe ich, begründeterweise (s.o.), anders. Aber vielleicht hat das Script ja mehrere Fehler. Ich habe es nicht ausprobiert.
Gruß, Cybaer
Hi,
Ich werde mir morgen mal ein IE6 suchen und das Beispiel probieren.
ich mußte die Zeile if (xmlHttpRequest.responseXML.documentElement != null) noch entfernen, aber dann habe ich immer noch das gleiche Problem. Auch im IE6. Ich habe 6.0.2900.2180.xpsp_sp2. Können das irgendwelche Einstellungen sein?
Gruß hesst
Hi,
Dein Beispiel funktioniert bei mir im IE 6 ohne Probleme.
Interessant, denn wenn ich das zitierte document.open()-Beispiel aus SELFHTML so umschreibe, wie hesst es verwendet, passiert genau das gleiche auf meinen IEs: Er bricht nach dem document.open() ab.
Gruß, Cybaer
Hi,
Interessant, denn wenn ich das zitierte document.open()-Beispiel aus SELFHTML so umschreibe, wie hesst es verwendet, passiert genau das gleiche auf meinen IEs: Er bricht nach dem document.open() ab.
Ja, das sage ich doch die ganze Zeit, das document.open will nur hier nicht. Der open bricht nicht ab, das habe ich noch rausgefunden. Der IE ist danach nicht mehr zu gebrauchen.
Gruß, hesst
Hi,
Ja, das sage ich doch die ganze Zeit, das document.open will nur hier nicht.
? Du hast gesagt, daß es doch funktionieren müßte, und auf das (auch im IE) funktionierende SELFHTML-Beispiel verwiesen.
Ich habe dir gesagt, daß das Beispielscript nicht identisch ist.
Wenn ich das SELFHTML-Beispiel so umschreibe, wie Du es verwendest, verhält es sich genau so, wie Du es für dein Script beschreibst.
Aber: Man kann das SELFHTML-Beispiel so umschreiben, wie Du es verwendest, aber man kann deinen Code nicht so umschreiben, so daß er dem SELFHTML-Beispiel entspricht.
Ergo wirst Du dir was anderes einfallen lassen müssen. Mehrere Vorschläge wurden gemacht, die allesamt dein Problem lösen.
Ich frage mich nur, was größer ist: Die Anzahl der Fehler im IE, oder deine Beratungsresistenz ...
... was mir persönlich allerdings egal ist, denn ich kann mit beidem leben. >;->
Gruß, Cybaer
Hi,
wenn du so allwissend bist, dann lasse mich doch an deinem Wissen teilhaben.
? Du hast gesagt, daß es doch funktionieren müßte, und auf das (auch im IE) funktionierende SELFHTML-Beispiel verwiesen.
Und funktioniert das SELFHTML-Beispiel denn nicht?
Ich habe dir gesagt, daß das Beispielscript nicht identisch ist.
Ja, logisch, ich will ja auch was anderes machen.
Wenn ich das SELFHTML-Beispiel so umschreibe, wie Du es verwendest, verhält es sich genau so, wie Du es für dein Script beschreibst.
Wie hast du es denn umgeschrieben? In onreadystatechange aufgerufen?
Ergo wirst Du dir was anderes einfallen lassen müssen. Mehrere Vorschläge wurden gemacht, die allesamt dein Problem lösen.
Welche denn, außer über DOM-Methoden zu gehen?
Ich frage mich nur, was größer ist: Die Anzahl der Fehler im IE, oder deine Beratungsresistenz ...
Kein Grund ausfallend zu werden.
Gruß, hesst
Hi,
wenn du so allwissend bist, dann lasse mich doch an deinem Wissen teilhaben.
Ich bin nicht allwissend, aber an meinem Wissen habe ich dich teilhaben lassen. Ist doch auch was! ;)
? Du hast gesagt, daß es doch funktionieren müßte, und auf das (auch im IE) funktionierende SELFHTML-Beispiel verwiesen.
Und funktioniert das SELFHTML-Beispiel denn nicht?
Doch, es funktioniert.
Ich habe dir gesagt, daß das Beispielscript nicht identisch ist.
Ja, logisch, ich will ja auch was anderes machen.
Erkenne das Prinzip dahinter!
Wenn ich das SELFHTML-Beispiel so umschreibe, wie Du es verwendest, verhält es sich genau so, wie Du es für dein Script beschreibst.
Wie hast du es denn umgeschrieben? In onreadystatechange aufgerufen?
Nein, im OnClick-Event.
Jetzt: <a href="javascript:writeFunc();">Ersetze Seite</a>
Das funktioniert.
Ersetzt man den Link, der eine neue Seite mit dem JS-Code als "Inhalt" öffnet durch einen Eventhandler (wie onreadystatechange) der die aktuelle Seite nur überschreibt, dann hört der (bzw. zumindest mein) IE nach dem document.open() auf:
Event: <span onclick="writeFunc();">Ersetze Seite</span>
Ergo wirst Du dir was anderes einfallen lassen müssen. Mehrere Vorschläge wurden gemacht, die allesamt dein Problem lösen.
Welche denn, außer über DOM-Methoden zu gehen?
Das ist die wichtigste. Sie funktioniert immer. Und ich sehe keine Grund, sie nicht umzusetzen. Hast Du denn Gründe dafür? Genannt hast Du bisher keinen (denken kann ich mir allerdings auch keinen).
Die andere war, die Daten synchron zu laden, ggf. mit einem lokalen Webserver - sollte es nicht im ein Script im Internet gehen. Dann kann es auch beim document.open() bleiben.
Kein Grund ausfallend zu werden.
Nicht? Verdammt! :)
Gruß, Cybaer
Hi,
Ich bin nicht allwissend, aber an meinem Wissen habe ich dich teilhaben lassen. Ist doch auch was! ;)
Danke oh großer Meister.
Doch, es funktioniert.
Also kann der IE und alle anderen Browser auch document.open.
Erkenne das Prinzip dahinter!
Hää?
Nein, im OnClick-Event.
Ist prinzipiell das selbe.
Das ist die wichtigste. Sie funktioniert immer. Und ich sehe keine Grund, sie nicht umzusetzen. Hast Du denn Gründe dafür? Genannt hast Du bisher keinen (denken kann ich mir allerdings auch keinen).
Zw. document.open() und document.close() stehen ca. 1000 document.write's. Dort werden auch selbst wider scripte eingebunden. Wenn ich das umschreiben soll, bin ich monate unterwegs.
Die andere war, die Daten synchron zu laden, ggf. mit einem lokalen Webserver - sollte es nicht im ein Script im Internet gehen. Dann kann es auch beim document.open() bleiben.
Einen lokalen Webserver will ich nicht, sonst hätte ich auch gleich PHP nehmen können. Und es soll auch im INet laufen.
Finde einen Trick, der document.open im onreadystatechange zum laufen bringt (asynchron) und du bist der Held.
Gruß, hesst
Yerf!
Einen lokalen Webserver will ich nicht, sonst hätte ich auch gleich PHP nehmen können. Und es soll auch im INet laufen.
Finde einen Trick, der document.open im onreadystatechange zum laufen bringt (asynchron) und du bist der Held.
Installiere einen anderen Browser ;-)
Nein, jetzt noch mal ernsthaft, weil ichs evtl. im Thread verpasst hab: was war nochmal der Grund, weshalb der Request unbedingt asynchron laufen muss? Ich seh eigentlich keinen und bei einem synchronen Request hast du das Problem mit dem Event-Handler nicht mehr.
Gruß,
Harlequin
Hi,
Nein, jetzt noch mal ernsthaft, weil ichs evtl. im Thread verpasst hab: was war nochmal der Grund, weshalb der Request unbedingt asynchron laufen muss? Ich seh eigentlich keinen und bei einem synchronen Request hast du das Problem mit dem Event-Handler nicht mehr.
Als Sekundärlösung kann ich den Request auch synchron laufen lassen bzw. auch gleich für den IE das Fallback mit xmlDoc.load(xmlFile); nehmen. Für alle Browser synchron laufen lassen macht lokal bei irgendeinem Probleme, da zugegebener Maßen, das Requestobjekt ja auch eher für Client/Server-Umgebungen gedacht ist.
Hi,
Also kann der IE und alle anderen Browser auch document.open.
Natürlich!
Erkenne das Prinzip dahinter!
Hää?
Ich schrieb's: Einmal wird über einen Link eine neue Seite geöffnet, deren Inhalt durch die Link-"Resource" erzeugt wird.
Das andere Mal wird die bestehende Seite direkt überschrieben.
Zw. document.open() und document.close() stehen ca. 1000 document.write's. Dort werden auch selbst wider scripte eingebunden. Wenn ich das umschreiben soll, bin ich monate unterwegs.
Bedauerlich! :-/
Aber daß man mit write() nicht in aktuelle Seiten schreiben kann, ...
Finde einen Trick, der document.open im onreadystatechange zum laufen bringt (asynchron) und du bist der Held.
... und es daher keine sichere Lösung geben kann, gehört IMHO halt zum JS-Basiswissen.
Aber:
1. 1000 write() sind gar schröcklich unperformant. Sinnvoller ist es, alle Ausgaben in einem String zu sammeln, und den dann mit einem einzigen write() auszugeben.
2. Wenn man das hat, sollte die Umstellung auf DOM relativ einfach sein - jedenfalls wenn man innerHTML bemüht.
3. Man kann die Umwandlung beschleunigen, durch sinnvolle Suchen/Ersetzen-Aktionen (sollte mit jedem besseren Editor kein Problem sein - Notepad++ erlaubt hier sogar RegExp).
Ansonsten eine echte Hack-Variante:
Nimm ein Frameset mit einem unsichtbaren und einem zu 100% sichtbaren Frame. Im unsichtbaren Frame läuft der Request, und das write() erfolgt in den sichtbaren Frame. :-)
Gruß, Cybaer
Hi,
Erkenne das Prinzip dahinter!
Hää?Ich schrieb's: Einmal wird über einen Link eine neue Seite geöffnet, deren Inhalt durch die Link-"Resource" erzeugt wird.
Das andere Mal wird die bestehende Seite direkt überschrieben.
In beiden Fällen wird die bestehende Seite direkt überschrieben. Beim 2. Überschreiben wird ein Link auf eine andere Seite eingefügt.
Zw. document.open() und document.close() stehen ca. 1000 document.write's. Dort werden auch selbst wider scripte eingebunden. Wenn ich das umschreiben soll, bin ich monate unterwegs.
Bedauerlich! :-/
Du sagst es.
Aber daß man mit write() nicht in aktuelle Seiten schreiben kann, ...
willst du sagen, ich soll das open weglassen? Geht (auch) nicht.
Aber:
- 1000 write() sind gar schröcklich unperformant. Sinnvoller ist es, alle Ausgaben in einem String zu sammeln, und den dann mit einem einzigen write() auszugeben.
Hast recht, aber fällt beim laden der Bilder nicht weiter ins Gewicht.
- Wenn man das hat, sollte die Umstellung auf DOM relativ einfach sein - jedenfalls wenn man innerHTML bemüht.
- Man kann die Umwandlung beschleunigen, durch sinnvolle Suchen/Ersetzen-Aktionen (sollte mit jedem besseren Editor kein Problem sein - Notepad++ erlaubt hier sogar RegExp).
Ganz so einfach ist es nicht, schau mal in deine Mail.
Gruß, hesst
Hi,
und nochmal, lokal funktioniert das auch im IE - asynchron. Warum nicht im Netz?
Gruß hesst
Hi,
und nochmal, lokal funktioniert das auch im IE - asynchron. Warum nicht im Netz?
Das zu diskutieren, ist IMHO müßig.
Gruß, Cybaer
Hi,
Aber daß man mit write() nicht in aktuelle Seiten schreiben kann, ...
willst du sagen, ich soll das open weglassen? Geht (auch) nicht.
Nein, denn das write() impliziert *automatisch* ein open().
Ist so definiert.
- Man kann die Umwandlung beschleunigen, durch sinnvolle Suchen/Ersetzen-Aktionen (sollte mit jedem besseren Editor kein Problem sein - Notepad++ erlaubt hier sogar RegExp).
Ganz so einfach ist es nicht, schau mal in deine Mail.
Ach du Scheiße ...
... sieht ja eher nach PHP aus.
- 1000 write() sind gar schröcklich unperformant. Sinnvoller ist es, alle Ausgaben in einem String zu sammeln, und den dann mit einem einzigen write() auszugeben.
Hast recht, aber fällt beim laden der Bilder nicht weiter ins Gewicht.
Alleine die zahlreichen externen Scripte, ziehen die Performance drastisch runter. Da ist schon viel gewonnen, das deutlichst zu reduzieren.
Also mein Tip: Es so lassen, wie es ist, und erstmal auf synchronen Request umsteigen (und dann direkt anschließend den Output) oder die Variante mit dem "Request"- und dem "Output"-Frame (mit ersetzen von document.write() durch frames["output"].document.write()).
Und wenn man Zeit hat, das ganze System vielleicht mal grundlegend anders angehen. Trennung von Code und Layout sowie Modularisierung ...
Gruß, Cybaer
Dein Beispiel funktioniert bei mir im IE 6 ohne Probleme.
Interessant, denn wenn ich das zitierte document.open()-Beispiel aus SELFHTML so umschreibe, wie hesst es verwendet, passiert genau das gleiche auf meinen IEs: Er bricht nach dem document.open() ab.
Entweder verstehe ich was falsch oder ich mache was falsch. Das Beispiel funktioniert bei mir im IE 6: http://selfhtml.jstruebig.de/documentopeninonreadystatechangefunktioniert.html
Struppi.
Hi,
Entweder verstehe ich was falsch oder ich mache was falsch. Das Beispiel funktioniert bei mir im IE 6: http://selfhtml.jstruebig.de/documentopeninonreadystatechangefunktioniert.html
Nein, du verstehst nichts falsch. Bei mir, im IE7 jetzt wieder, geht das Beispiel nicht. Im IE6 werde ich gleich mal testen.
gruß hesst
Hi,
Nein, du verstehst nichts falsch. Bei mir, im IE7 jetzt wieder, geht das Beispiel nicht. Im IE6 werde ich gleich mal testen.
Im "einfachsten" Fall, und den vermute ich hier angesichts des "läuft", "läuft nicht", liegt hier eine "race condition" vor. Wenn man Glück hat, funktioniert's, wenn man Pech hat, eben nicht. Also mal hat der IE den alten Code bereits entsorgt, mal hat er gerade noch Zugriff und kann ihn ausführen ...
Gruß, Cybaer
Hi,
Im "einfachsten" Fall, und den vermute ich hier angesichts des "läuft", "läuft nicht", liegt hier eine "race condition" vor. Wenn man Glück hat, funktioniert's, wenn man Pech hat, eben nicht. Also mal hat der IE den alten Code bereits entsorgt, mal hat er gerade noch Zugriff und kann ihn ausführen ...
Ich denke nicht, daß der IE den alten Code bereits entsorgt hat. Denk mal an das SELFHTML-Beispiel http://de.selfhtml.org/javascript/objekte/anzeige/document_open.htm , das dürfte dann gar nicht gehen.
Das Problem ist wohl eher ein Deadlock. Aber das ist nur eine Vermutung.
Gruß, hesst
Hi,
Ich denke nicht, daß der IE den alten Code bereits entsorgt hat.
Ich denke, die IE-Entwickler haben zu wenig gedacht. ;->
Gruß, Cybaer