IE verschlückt Zeichen
Donald
- javascript
Hallo,
Ich baue Teile meiner Webseite dynamisch per XMLHttpRequest() auf.
Auch FireFox, Konqueror und Opera läuft es Problemlos. Beim IE 6 und 7 habe ich aber ein Problem damit, dass im nachgeladenen Code einfach Teile fehlen.
Ich instanziere XMLHttpRequest() so:
--------------------------------------------------------------
if (window.XMLHttpRequest) {
LChttp[ElementID] = new XMLHttpRequest();
} else if (window.ActiveXObject) {
LChttp[ElementID] = new ActiveXObject("Microsoft.XMLHTTP");
}
LChttp[ElementID].open("GET", URL, true);
LChttp[ElementID].onreadystatechange = LoadOutput;
LChttp[ElementID].send(null);
Ich hab das dann so getestet:
--------------------------------------------------------------
function LoadOutput() {
// outputs the result to the ElementID element
if (LChttp[ElementID].readyState == 4) {
var Content = LChttp[ElementID].responseText;
// set new content
document.getElementById(ElementID).innerHTML = Content;
// validate content
if (document.getElementById(ElementID).innerHTML == Content) {
alert("OK");
} else {
Message = "Fail in '" + ElementID + "' for " + LCLastURL[ElementID];
Message = Message + "\n";
Message = Message + "Länge Original: " + Content.length + "\n";
Message = Message + "Länge aus DOM: " + document.getElementById(ElementID).innerHTML.length + "\n";
alert(Message);
}
}
}
Bei fast allen Browsern spuckt es OK aus. Aber beim IE kommen dann Fehler. Beispiel-Fehler:
Fail im 'MainArea' for /test.php
Länge Original: 17539
Länge aus DOM: 13427
Wenn ich das im Developer Toolbar dann untersuche, dann fehlen aus dem Source wilde Teile. Mitten im Statement wird dann was rausgerissen oder weggelassen.
Innerhalb von LoadContent() kommt in Content definitiv das richtige an. Aber irgendwie klappt es beim setzen als InnerHTML nicht. Warum macht der IE die Daten hier beim Einfügen kaputt? Gibt es Regeln, dass man da manches nicht reintun darf?
Was kann das sein?
Donald
Hi,
document.getElementById(ElementID).innerHTML = Content;
// validate content
if (document.getElementById(ElementID).innerHTML == Content) {
Das ist kein sinnvoller Versuch einer "Validierung".
Erst weist du innerHTML HTML-Code zu.
Den parst der Browser dann, und fuegt ihn in seinen DOM-Baum ein.
Anschliessend wird auf innerHTML wieder lesend zugegriffen. Dabei erstellt der Browser aus dem DOM-Baum wieder eine HTML-Repraesentation.
Die Annahme, diese muesse wieder dem originalen Code entsprechen, ist aber zu verwegen.
Bei fast allen Browsern spuckt es OK aus. Aber beim IE kommen dann Fehler. Beispiel-Fehler:
Fail im 'MainArea' for /test.php
Länge Original: 17539
Länge aus DOM: 13427
"Da kommen Fehler" bedeutet in diesem Falle zunaechst lediglich, dass dein Script Fehlermeldungen ausgibt, weil du unguenstige Pruefungen vornimmst.
Wenn ich das im Developer Toolbar dann untersuche, dann fehlen aus dem Source wilde Teile. Mitten im Statement wird dann was rausgerissen oder weggelassen.
Der IE hat ein sehr eigenes Verstaendnis davon, wie die Repraesentation von DOM-Knoten per innerHTML aussieht.
Irgendein(e) "Source" sollte dich letztendlich aber auch nicht interessieren.
Interessant ist lediglich, hat der Browser alle Elemente so ins DOM eingefuegt, wie beabsichtigt?
Innerhalb von LoadContent() kommt in Content definitiv das richtige an. Aber irgendwie klappt es beim setzen als InnerHTML nicht. Warum macht der IE die Daten hier beim Einfügen kaputt? Gibt es Regeln, dass man da manches nicht reintun darf?
Zunaechst mal kann der IE sehr empfindlich reagieren, wenn der Code, den man per innerHTML zuweisen will, nicht valide ist.
Dann kann man auch nicht fuer alle Element auf innerHTML schreibend zugreifen (siehe Dokumentation in der MSDN).
Und auch, was das dynamische Hinzufuegen von Formularelementen angeht, kann der IE sehr eigen sein.
MfG ChrisB
Hallo ChrisB,
Natürlich weiss ich, dass ich die Fehlermeldung mache. Die Fehler im IE kommen daher, dass der Code dann nicht valide ist. Warum das so ist, soll mein Code ja rausfinden.
Ich setze den innerHTML übrigens für einen DIV Container. Der hat laut Doku die "Erlaubnis".
Meine Validierung klappt ganz gut bei Firefox, Opera und Konqueror. Nur beim IE6 und 7 nicht.
Ungeachtet dessen: Wenn ich den per innerHTML eingefügten Code im Developer Toolbar dann ansehe, dann sind zB nach 7540 guten Zeichen plötzlich über 100 rausgeschnitten. Mitten in einem <INPUT> Tag. Dann geht es unverändert weiter. Nach weiteren 642 Zeichen fehlen plötzlich ca. 50 Zeichen. Einfach so. Wieder mitten in einem <div style=""> Tag. Das Resultat sieht dann grauslig aus und läuft natürlich nicht.
Warum schnippelt mir der IE einfach Teile raus wenn ich per innerHTML einfüge?
Donald
Hi,
Warum schnippelt mir der IE einfach Teile raus wenn ich per innerHTML einfüge?
Per Google finde ich durchaus Stellen, die nahelegen, dass innerHTML eine Laengenbeschraenkung haben koennte, bzw. bei Ueberschreitung gewisser Laengen unerwartete Resultate liefert.
Wenn du schon fast an fuenfstellige Zeichenanzahlen herankommst, dann frage ich mich, was du da per AJAX nachlaedst - und ob das noch sinnvoll sein kann ...?
MfG ChrisB
Der IE hat ein sehr eigenes Verstaendnis davon, wie die Repraesentation von DOM-Knoten per innerHTML aussieht.
Mehr als ein »eigenes« Verständnis davon kann ein Browser auch nicht haben. Spezifiziert die Serialisierung wird das höchstens in HTML 5. Alles davor ist der legendäre »Quirks«, im Deutschen am besten mit »Kraut und Rüben« übersetzt.
Mathias
GELÖST!!!
Durch intensives vergleichen hab ich rausgefunden, dass hinter einem meiner <INPUT> Tags ein Anführungszeichen zu viel war. Das hat dazu geführt, dass einiges später im Source immer mal wieder was fehlte.
Ich hab jetzt danach gesucht und drei Stellen gefunden und korrigiert. Jetzt klappts einwandfrei.
Danke fürs mitdenken!
Donald