responseXML Problem beim FireFox
Jurik
- javascript
Heyho Leute,
wußte nicht genau, welches Themengebiet das richtige ist - aber dieses Problem hat nur der FireFox.
Mein PHP Script sendet per echo (headers modified: text/xml) ein XML file an das JS-File zurück.
Per responseXML bekommt mein Browser sie. Ich habe die Daten, welche der Browser per POST bekommt gecheckt - alle sind da.
Will ich sie nun aber ausgeben stoppt er bei ca. 3900 Zeichen. Das seltsame ist, dass er dennoch die Tags noch schließt. Sprich, wenn ich mir den Quellcode anschaue steht da:
<div class="das_ist_ein_t"></div>
anstatt
<div class="das_ist_ein_test"></div>
Natürlich müßten danach noch weitere DIVs und so kommen, die er aber gar nicht mehr ausgibt.
Folgend sieht mein Script aus:
function getSearchResult(search,uid){
document.getElementById('loading').style.display='block';
search = document.getElementById(search+'_search_input').value;
var query = 'UID='+uid+
'&action=getSearchResult'+
'&search='+encodeURIComponent(search);
var xmlhttp = new ajaxRequest(
'../ajax-handler.php',
function()
{
var http = xmlhttp.req;
if (http.readyState==4)
{
document.getElementById('loading').style.display='block';
if(http.status == 200) {
document.getElementById('loading').style.display='none';
var daten = http.responseXML;
display_xml(daten);
}
else
{
}
}
},
"POST",
query,
["Content-Type","application/x-www-form-urlencoded"]
);
xmlhttp.doRequest();
}
display_xml schaut dann folgendermaßen aus:
/**
* fills the xml to screen
*/
function display_xml(xml){
var content = xml.getElementsByTagName('content')[0].childNodes;
for(var i=0; i < content.length; i++){
document.getElementById(content[i].tagName).innerHTML = decodeURIComponent(content[i].firstChild.nodeValue).replace(/+/g,' ');
}
}
Und das XML file so:
$xml_file = '<?xml version="1.0" encoding="UTF-8"?>';
$xml_file.= '<content>';
$xml_file.= '<body>'.htmlentities($content).'</body>';
$xml_file.= '<box2>Das is die Suche!!!</box2>';
$xml_file.= '</content>';
header('Content-type: text/xml');
echo $xml_file;
Wobei der Fehler irgendwo in der Zeile:
document.getElementById(content[i].tagName).innerHTML = decodeURIComponent(content[i].firstChild.nodeValue).replace(/+/g,' ');
liegen muss. Da nicht alle Daten vom XML-Tag <body> in das div mit der id body geladen werden. Aber das was im XML-Tag <box2> steht wird wiederrum in das DIV mit der ID box2 geladen.
Also gibts wohl eine max length von innerHTML = <content> ...
Kennt wer das Problem?
Hallo Jurik,
function display_xml(xml){
var content = xml.getElementsByTagName('content')[0].childNodes;
for(var i=0; i < content.length; i++){
document.getElementById(content[i].tagName).innerHTML = decodeURIComponent(content[i].firstChild.nodeValue).replace(/+/g,' ');
}
}Und das XML file so:
$xml_file = '<?xml version="1.0" encoding="UTF-8"?>';
$xml_file.= '<content>';
$xml_file.= '<body>'.htmlentities($content).'</body>';
$xml_file.= '<box2>Das is die Suche!!!</box2>';
$xml_file.= '</content>';
header('Content-type: text/xml');
echo $xml_file;
nur eine Vermutung: Die Zeilenumbrüche zwischen den Zeilen werden als Textknoten erkannt. Ich würde hier auf firstChild o.Ä. verzichten und eher
document.getElementsByTagName('content')[x].getElementsByTagName('body')[y]....
verwenden.
Gruß, Jürgen
Danke,
daran liegts leider auch nicht.
Hab nen Test gemacht und werd oben einen neuen Thread mit passendem Titel posten. Ist eindeutig ein Bug von FireFox.
Hallo Jurik,
wir sollten hier weitermachen. Kannst du mal eine Testseite online stellen, damit man sich das mal ansehen kann?
Gruß, Jürgen
Na okay ... also ich hab den Bug bei FF reportet und rausgefunden, dass des schon seit 2003 bekannt ist.
Und jetzt kommt der Hammer *lach*...
Also die Gecko Engine ist die einzige Engine die nodeValues von XML files bei 4096 aufteilt. Und dies wohl aus Performance-Gründen.
MozDev Bug Link: https://bugzilla.mozilla.org/show_bug.cgi?id=194231
Der Witz ist echt, dass die Developer selber unter sich uneins sind ob sie das machen 'dürfen' oder nicht. Aber sche**** ist es schon, dass sie es machen aber niemandem sagen ;) - die Lösung war dann versteckt in irgendeiner der Posts ... "However, Mozilla splits consecutive block of text in a HTML Tag into multiple textNode(s) of 4KB. "
Sprich: ich hab ein nodeValue obj[0] mit 6096 bytes
IE: obj[0] mit 6096 bytes
opera: obj[0] mit 6096 bytes
firefox: obj[0] mit 4096 bytes und obj[1] mit 2000 bytes
Jetzt ist nur die Frage wie man es dynamisch ausliest.
Hier der Link: http://test.wii-connection.de/test_stuff/xml-test/xml.html
Und hier der Quellcode nochmal (etwas modifiziert):
HTML:
<html>
<head>
<title>AJAX</title>
<script type="text/javascript">
var http = null;
if (window.XMLHttpRequest) {
http = new XMLHttpRequest();
} else if (window.ActiveXObject) {
http = new ActiveXObject("Microsoft.XMLHTTP");
}
window.onload = function() {
if (http != null) {
http.open("GET", "test.xml", true);
http.onreadystatechange = ausgeben;
http.send(null);
}
}
function ausgeben() {
if (http.readyState == 4) {
alert('wrong length ob obj[0] in bytes: '+http.responseXML.getElementsByTagName('links')[0].firstChild.nodeValue.length);
document.body.innerHTML+= http.responseXML.getElementsByTagName('links')[0].firstChild.nodeValue;
alert('truncated obj[0] becomes obj[1] in bytes: '+http.responseXML.getElementsByTagName('links')[0].lastChild.nodeValue.length);
document.body.innerHTML+= http.responseXML.getElementsByTagName('links')[0].firstChild.nodeValue;
}
}
</script>
</head>
<body>
<ul id="Liste"></ul>
</body>
</html>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<links>{mehr als 4096 chars zum testen eingeben!}</links>
{mehr als 4096 chars zum testen eingeben!} mit mehr als 4096 Zeichen ersetzen.
Hier nun die Lösung:
HTML FILE 'xml.html':
<html>
<head>
<title>AJAX</title>
<script type="text/javascript">
var http = null;
if (window.XMLHttpRequest) {
http = new XMLHttpRequest();
} else if (window.ActiveXObject) {
http = new ActiveXObject("Microsoft.XMLHTTP");
}
window.onload = function() {
if (http != null) {
http.open("GET", "test.xml", true);
http.onreadystatechange = ausgeben;
http.send(null);
}
}
function ausgeben() {
if (http.readyState == 4) {
alert(http.responseXML.getElementsByTagName('links')[0].childNodes.length);
for(var i = 0; i < http.responseXML.getElementsByTagName('links')[0].childNodes.length; i++){
alert('Truncated OBJ Number: '+i+'\nCharacters (bytes): '+http.responseXML.getElementsByTagName('links')[0].childNodes[i].nodeValue.length);
document.body.innerHTML+=http.responseXML.getElementsByTagName('links')[0].childNodes[i].nodeValue;
}
}
}
</script>
</head>
<body>
<ul id="Liste"></ul>
</body>
</html>
XML file 'test.xml':
<?xml version="1.0" encoding="UTF-8"?>
<links>{4096+100 Zeichen}LASTLINELASTLINE</links>
{4096+100 Zeichen} mit am besten 5000 Zeichen füllen.
Man man ... darauf muss man mal kommen. Hoffe das hilft einigen weiter. Hab viele Postings im iNet gefunden und nirgends eine Lösung.
Im FireFox und Opera geht auch noch textContent auf die Node mit dem vermeindlichen Text der mehr als 4096 bytes hat.
textContent fasst dann alle aufgesplitteten Elemente wieder zusammen.