2010-12-10 10 views
3

Je reçois des données XML via un appel AJAX. L'un des tags contient une grande quantité de texte, environ 4000-5000 caractères. Dans Firefox, le champ est tronqué autour du 3000ème caractère. La plupart des choses que j'ai trouvées en ligne disent qu'il n'y a pas de limite à la taille des nœuds, mais parfois cela dépend de l'implémentation - pas de réponses solides.Taille limite au champ javascript [noeud] .nodeValue?

Est-ce que quelqu'un a des suggestions pour expliquer pourquoi cela pourrait se produire, en supposant qu'il n'y ait aucune restriction sur la taille de nodeValue? Des solutions de contournement si oui?

<test> 
    <foo>very long string...</foo> 
</test> 

value = testTag.getElementsByTagName("foo").item(0).firstChild.nodeValue; 

La valeur est tronquée. -Si j'imprime xmlHttp.responseText, toutes les données sont imprimées.

Répondre

4

Vérifiez this. Il est dit:

"Il est également important de noter que, bien que les spécifications stipulent que peu importe la quantité de texte qui existe entre les balises, tout devrait être dans un seul nœud de texte, en pratique ce n'est pas toujours le cas. 9.2x et Mozilla/Netscape 6+, si le texte est plus grand qu'une taille maximale spécifique, il est divisé en plusieurs nœuds de texte, ces deux nœuds de texte seront côte à côte dans la collection childNodes de l'élément parent. "

+0

Bon article - c'était la solution! – Jmoney38

+0

http://www.howtocreate.co.uk/ est un super site aussi, je pourrais ajouter. – KooiInc

1

@Kooilnc a raison, limite de 4 Ko sur les nœuds de texte dans Firefox.

Vous pouvez travailler autour d'elle en faisant ceci:

function getNodeText(xmlNode) { 
    if(!xmlNode) return ''; 
    if(typeof(xmlNode.textContent) != "undefined") return xmlNode.textContent; 
    return xmlNode.firstChild.nodeValue; 
} 

text = getNodeText(document.getElementsByTagName("div").item(0)); 
alert(text.length); 

voir en action ici: http://jsfiddle.net/Bkemk/2/

Fonction empruntée ici: http://www.quirksmode.org/dom/tests/textnodesize.html

0

Ce que je suis venu avec au lieu de ciblant un seul noeud:

function getDataOfImmediateChild(parentTag, subTagName) 
{ 
    var val = ""; 
    var listOfChildTextNodes; 
    var directChildren = parentTag.childNodes; 

    for (m=0; m < directChildren.length; m++) 
    { 
     if (directChildren[m].nodeName == subTagName) 
     { 
      /* Found the tag, extract its text value */ 
      listOfChildTextNodes = directChildren[m].childNodes; 
      for (n=0; n < listOfChildTextNodes.length; n++) 
      { 
       if (typeof listOfChildTextNodes[n] == "TextNode") 
       val += listOfChildTextNodes[n].nodeValue; 
      } 
     } 
    } 
    return val; 

Il peut être utile de vérifier également que l'élément listOfChildTextNodes [n] est un TextNode.

0

@Ryley

La seule raison pour laquelle je fais une itération sur les enfants directs est parce que getElementsByTagName et getElementsById retourneront les nœuds qui sont plus bas dans la hiérarchie. Mieux expliqué à titre d'exemple:

<foo> 
    <bar> 
    <zoo> 
     <bar>-</bar> 
    </zoo>  
    <bar></bar> 
</zoo> 

Si je dis fooTag.getElementsByTagName (« bar »), il va retourner un tableau de deux s, même si je ne veux que le second (car il est le seul véritable enfant de). La seule façon de penser à imposer cette "recherche seulement à mes enfants directs" est de faire des itérations sur les enfants.

+0

Cela ne semble pas vraiment pertinent à votre question. Je suis d'accord que getElementsByTagName agit comme vous le décrivez. – Ryley