innerHTML schneidet Text ab! warum

WebRabbit

Mitglied
Hallo Leute, ich hab da mal ein kleines Problem. Ich übergebe per AJAX Variablen an ein PHP Skript, welches die Daten mittels Datenbankabfrage verarbeitet und quasi eine Linkliste zurück gibt. Das ganze funktioniert auch wunderbar, es sei denn die Liste und somit der zurückgegebene Inhalt ist zu lang. Der Text wird dann einfach abgeschnitten, es kommt keine Fehlermeldung, die Error-Console ist leer und die bis dahin ausgegebenen Links funktionieren auch alle.
Ich habe schon alles mögliche Ausprobiert. An PHP und auch an der XML Rückgabe liegt es nicht. Der Text wird vollständig zurückgegeben. Nur beim einbinden mit innerHTML wird etwas abgeschnitten.

Nachtrag:
Habe gerade festgestellt, dass es im IE richtig dargestellt wird, also der Text komplett ist. Verlässt mich jetzt etwa mein sonst hochgelobter Firefox?
Jemand eine Idee woran das liegt? Oder wie könnte ich das ganze umgehen?

Vielen Dank für eure Mühe!

MFG Webrabbit
 
Zuletzt bearbeitet:
Hi,

nur mal so ins Blaue vermutet: ist das Element, in dem die Linkliste ausgegeben wird, mit der CSS-Eigenschaft height formatiert?

Die wird nämlich vom IE fälschlicherweise als "Mindesthöhe", und von den standardkonformen Browsern als fixe Höhenangabe behandelt, sodass der Elementinhalt abgeschnitten wird, wenn er die festgelegte Höhe überschreitet.

Stylesheet zur browserübergreifenden Einrichtung einer Mindesthöhe, damit das Element bei zunehmenden Inhalt in der Höhe "mitwächst":

Code:
min-height:200px; /* Mindesthöhe in Firefox & Co. */
height:auto !important; /* auto-height mit !important-Regel für Firefox & Co., damit sie die nachfolgende height-Angabe ignorieren */
height:200px; /* "Mindesthöhe" in IE */

mfg Maik
 
Danke für Deinen Beitrag, daran hatte ich auch schon gedacht, daran lag es aber nicht. Zwischenzeitlich habe ich herausgefunden das es sich wohl um einen FF "Bug" handelt. nodeValues von XML Strukturen werden beim FF in 4096bytes aufgeteilt. Daher werden einfach ab einer bestimmten Anzahl Zeichen mit innerHTML keine Zeichen mehr ausgegeben. Da ich per AJAX Daten an ein PHP-Skript übergebe, das Ergebnis per XML wieder in das Dokument übergebe und dann das Ergebnis mit innerHTML ausgebe, war mir Anfangs nicht klar, woher das Problem kommt. Habe dann aber das PHP-Skript und die XML Ausgabe ausschließen können. Blieb nur noch innerHTML bzw. die Ausgabe.
Nun ja wie auch immer, eine passende Lösung habe ich immer noch nicht. DOM Methoden statt innerHTML kommt bei mir nicht in Frage da zu viel Aufwand. Es muss noch eine Möglichkeit geben, evtl. über mehrere Knoten in XML Ausgabe Kenne mich leider mit XML gar nicht aus, stehe da noch am Anfang und benötige also dringend Hilfe.

Wenn mir jemand weiterhelfen könnte, wäre ich also sehr dankbar!

Gruß Webrabbit
 
So ich bin nun einen Schritt weiter gekommen. Nach langem, langem, langem Suchen...
Hier http://forum.de.selfhtml.org/archiv/2008/3/t168370/
wird mein Problem eigentlich exakt beschrieben. Nach dem dortigen Lösungsansatz habe ich mein Skript nun bearbeitet und siehe da, der fehlende Inhalt wird ausgegeben! ABER: Die Lösung teilt im Prinzip den zurückgegeben Inhalt in mehrere Blöcke auf und gibt diese nacheinander aus. Nun kommt aber das Problem, dass ein Stück des zweiten Blockes fehlt und somit das Layout auseinander gerissen wird (durch nicht geschlossene Tags) und in meinem Fall passiert das genau vor einem Link, der Anfang des <a> Tag fehlt und somit geht natürlich auch der Link nicht. Wie bekomme ich denn nun das fehlende Fragment?
 
Hallo Leute, schade das ich scheinbar relativ alleine Stehe mit meinem Problem obwohl ich eine Menge ähnlicher Fälle im Netz gefunden habe.. Da müsste es doch den einen oder anderen geben der mal mit der Problematik zu tun hatte? Beim Thema AJAX bin ich doch hier gar nicht so verkehrt oder

Nun ja wie dem auch sei, ich bin ein wenig weiter gekommen:
Ich habe mich ein wenig in XML eingelesen und somit nun kapiert wie ich die Elemente auslese. Ich habe also rausbekommen, das Firefox (scheinbar) einen XML-Response nach 4096 Zeichen teilt. Das heißt das es einfach statt einem, zwei Unterknoten anlegt, so möchte ich es mal Laienhaft ausdrücken... Lese ich diese nun getrennt aus und setze Sie nacheinander mit innerHTML in ein <div> ein, habe ich den gesamten Text.. also fast... DENN: Es fehlt ein Stück.

Ich fasse nochmal zusammen. Erst dachte ich es wird einfach Text ab einer bestimmten Länge von innerHTML abgeschnitten. Nun also nach langem Suchen das Ergebnis das der Text da ist und ausgegeben werden kann. Aber was mir nicht klar ist, warum wenn ich mir das XML Dokument separat ausgeben lasse alles da ist, nur wenn ich mir die Teilstücke über "xmlResponse.documentElement.childNodes[i].nodeValue" hole und zusammenführe, ca. 100Zeichen fehlen. Wo sind diese Zeichen abgeblieben?

Hier mal der Code zum auslesen der XML Daten:
Code:
var x =  xmlResponse.documentElement;
for(i=0; i< x.childNodes.length; i++){
     document.getElementById("content").innerHTML += x.childNodes[i].nodeValue;
     }


Wäre wirklich super dankbar für jede Hilfe!

Gruß Webrabbit
 
Hi,

wo die 100 Zeichen abgeblieben sind, kann ich dir nicht sagen. Aber vielleicht hilft dir ja ein anderer Lösungsansatz.

Du überprüfst die Knoten, die Textknoten enthalten. Dort testest du, ob der erste Kindknoten ein Textknoten ist, ob es mehr als einen Kindknoten gibt (Kriterium für Aufteilung) und ob die Grösse des Kindknotens grösser oder gleich 4kB ist. Sind all diese Kriterien erfüllt, handelt es sich offensichtlich um einen geteilten Textknoten und es wird der Inhalt der Eigenschaft textContent des überprüften Knotens verwendet.

Beispiel:
Code:
function checkNodeValue(objNode){
  // Falls alle Kriterien erfüllt => Textknoten wurde aufgeteilt => Inhalt von textContent
  if((objNode.childNodes.length>1)
     && (objNode.childNodes[0].nodeType == 3)
     && (objNode.childNodes[0].length >= 4096)){
      return objNode.textContent;
  // "Normaler" Textknoten
  }else{
    return objNode.firstChild.nodeValue;
  }
}
Die Funktion erwartet als Parameter den Knoten, der den zu testenden evtl. zu langen Text enthält.

Vielleicht kannst du mit diesem Ansatz etwas anfangen.

Ciao
Quaese
 
Hi,

vielleicht würde es auch ausreichen, wenn lediglich geprüft wird, ob die textContent-Eigenschaft vorhanden ist. Im Erfolgsfall wird der Inhalt über textContent zurück gegeben, andernfalls über die Standard-Eigenschaft nodeValue.
Code:
function checkNodeValue2(objNode){
  return (typeof objNode.textContent == "string")
         ? objNode.textContent
         : objNode.firstChild.nodeValue;
}
nodeValue ist wieder der Knoten, der den Textknoten enthält.

Ciao
Quaese
 
Hey vielen Dank,
für heute habe ich die Arbeit schon ad acta gelegt, aber werde es morgen gleich mal ausprobieren, es klingt auf jeden Fall viel versprechend und sieht so aus als würdest Du da durchblicken.. was ich von mir leider nicht behaupten kann :(
Ich habe mir soweit schon ausgeholfen, das ich nun statt XML Daten nur einen String übergebe, aber die XML Geschichte wäre doch bei einigen Dingen von Vorteil. Daher will ich da auf jeden Fall dranbleiben. Denke so oder so wird es nicht das letzte mal sein, dass ich mit diesem Phänomen zu tun habe. Wundert mich aber ernsthaft das sonst scheinbar wenige dieses Problem haben, oder hatten..

Werde auf jeden Fall berichten wie sich die Sache auswirkt..


Gruß Webrabbit
 
:)
Vielen Dank Quaese, DAS IST ES!
Unglaublich aber es funktioniert. Ich blick zwar noch nicht so ganz warum, vielleicht kann mir das bei Gelegenheit nochmal jemand erklären?
Die Sache sieht also wie folgt aus:

Code:
  var myCont = document.getElementById("content");

  function checkNodeValue(objNode){
    // Falls alle Kriterien erfüllt => Textknoten wurde aufgeteilt => Inhalt von textContent
    if((objNode.childNodes.length>1)
       && (objNode.childNodes[0].nodeType == 3)
       && (objNode.childNodes[0].length >= 4096)){
        return objNode.textContent;
    // "Normaler" Textknoten
    }else{
      return objNode.firstChild.nodeValue;
    }
  }
  var response = checkNodeValue(xmlResponse.documentElement);

  myCont.innerHTML = response;

Der Inhalt wird nun komplett ausgegeben. :)
 
Hi,

wie weiter oben schon erwähnt, stellt der Firefox neben der nodeValue-Eigenschaft die Eigenschaft textContent zur Verfügung. Unterschied liegt darin, das die erstgenannte Eigenschaft in 4kB-Blöcke geteilt wird, die zweigenannte nicht.

In der Funktion wird folgendes geprüft:
  1. Besteht nodeValue aus mehreren Blöcken (objNode.childNodes.length>1)
  2. Handelt es sich beim ersten Kindknoten um einen Textknoten (objNode.childNodes[0].nodeType == 3)
  3. Ist die Grösse des ersten Kindknotens grösser als 4kB (objNode.childNodes[0].length >= 4096)
Sind alle drei Kriterien erfüllt, wurde der Inhalt des Knotens in 4kB-Blöcke geteilt. In diesem Fall wird auf die Eigenschaft textContent zurückgegriffen.

Vielleicht hilft dir die Erklärung weiter.

Hast du im übrigen meinen zweiten Lösungsvorschlag angesehen. Dort wird gleich geprüft, ob die Eigenschaft textContent vorhanden ist und im Erfolgsfall dessen Inhalt verarbeitet. So können einige Vergleiche in der if-Bedingung gespart werden - bei umfangreichen XML-Dokumenten sicherlich performanter.

Ciao
Quaese
 

Neue Beiträge

Zurück