AJAX-Problem mit Google Chrome
Ale×
- javascript
Hallo,
ich habe ein kleines Problem mit Google Chrome: Ich habe in meinem Forum eine Art Eintrags-Vorschau. Wenn man auf
klickt, wird ein <div> eingeblendet (appendChild) und der Inhalt des Eintrags wird vom Server geholt und eingefügt.
Das funktioniert problemlos mit u.a. mit Firefox, Opera, IE und Safari. Aber ausgerechnet in Google Chrome (der doch gerade für AJAX gut sein soll) geht es nicht. Das <div> wird noch eingehängt aber der Inhalt wird nicht eingefügt.
Die JavaScript-Konsole meldet:
Uncaught TypeError: Cannot call method 'getElementsByTagName' of null http://mylittleforum.net/forum/js/main.js (line 473)
Tatsächlich ist bereits in Zeile 463 von main.js self.xmlHttpReq.responseXML = null und ich komme einfach nicht dahinter, warum das so ist.
Ich habe mal versucht, das Problem zu isolieren und hier geht es seltsamerweise auch in Chrome: test.html (es wird das selbe JS verwendet)
Hat jemand eine Idee, woran das liegen könnte? Oder wie ich vorgehen könnte, um es weiter einzugrenzen?
Danke!
Ale×
Hi,
vorweg: Meine Erfahrungen mit Google Chrome beschränken sich im Wesentlichen auf die Vorgänge der Installation und Deinstallation.
Tatsächlich ist bereits in Zeile 463 von main.js self.xmlHttpReq.responseXML = null und ich komme einfach nicht dahinter, warum das so ist.
Ist denn die responseText-Eigenschaft gefüllt? Wenn ja, ist das üblicherweise ein Zeichen dafür, dass der Browser ein Parsing-Problem hatte. Häufig sind ungünstige Encodings verantwortlich, auch wenn ich dafür auf den ersten Blick bei Dir keine Ursache finden kann. Lass Dir mal vor dem Aufruf von updatepage() sämtliche Eigenschaften und Werte des XMLHttpRequest-Objektes ausgeben.
Cheatah
Hallo Cheatah,
Ist denn die responseText-Eigenschaft gefüllt?
Nein, alert(self.xmlHttpReq.responseText) zeigt mir in Chrome nur ein leeres Alert-Fenster.
(In Firefox bekomme ich "<?xml version="1.0"?><posting><content><![CDATA[<p>Hi everyone...</p>]]></content></posting>")
Ale×
Hallo nochmal,
konnte das Problem noch etwas eingrenzen: es hat anscheinend mit Smarty zu zun.
Test ohne Smarty geht: test.html
Gleiches HTML mit Smarty ausgegeben geht nicht in Chrome: smarty_test.php
Ale×
...und nochmal weiter eingegrenzt: es ist doch nicht Smarty, es reicht schon, wenn die Seite von PHP ausgegeben wird:
Beide Dateien sind bis auf die Erweiterung identisch. index.php geht durch den PHP-Parser und funktioniert dann nicht mehr in Chrome. Dann kann es doch eigentlich nur noch am Header liegen, oder?
Ale×
Yerf!
Dann kann es doch eigentlich nur noch am Header liegen, oder?
Möglich... die PHP-Version liefert z.B. keine Charset-Angabe im Content-Type-Header.
Gruß,
Harlequin
Hallo Harlequin,
Möglich... die PHP-Version liefert z.B. keine Charset-Angabe im Content-Type-Header.
Sende nun die Charset-Angabe mit:
header('Content-Type: text/html; charset=utf-8');
Leider immernoch kein Unterschied: index.php
Ale×
Hallo,
habe es nun durch Rumprobieren herausgefunden: diese Zeile scheint zu stören:
self.xmlHttpReq.setRequestHeader('If-Modified-Since', document.lastModified);
Sie sollte den IE am Cachen hindern, scheint aber ohnehin überflüssig zu sein (es geht jedenfalls auch ohne sie im IE 5.5 bis 8).
Ale×
Hi,
habe es nun durch Rumprobieren herausgefunden: diese Zeile scheint zu stören:
self.xmlHttpReq.setRequestHeader('If-Modified-Since', document.lastModified);
Deine statische HTML-Variante wurde vom Server mit einem Last-Modified-Header ausgeliefert, die dynamische PHP-Variante hingegen nicht.
Scheint Chrome wohl nicht zu passen, einen If-Modified-Since mitzusenden, wenn der Server vorher nicht angezeigt hat, dass er an diesem interessiert sein koennte.
Sie sollte den IE am Cachen hindern, scheint aber ohnehin überflüssig zu sein (es geht jedenfalls auch ohne sie im IE 5.5 bis 8).
Den If-Modified-Since-Header selber mitzuschicken, sollte bei einer korrekten Implementierung von XMLHttpRequest durch den Browser m.E. unnoetig sein - um's Caching hat sich der Browser selber zu kuemmern, wie bei jedem anderen HTTP-Request auch. (Sonst muesste ich als Scriptersteller mich ja konsequenter Weise auch noch mit eventuellen 304 Not Modified-Antworten herumschlagen.)
Der IE hat allerdings Probleme mit Caching bei AJAX-Requests - sofern sie per GET gemacht werden. Wenn man jedoch POST verwendet, macht auch der IE keine Probleme.
MfG ChrisB