2010-12-10 10 views
3

私はAJAX呼び出しでXMLデータを受信して​​います。タグの1つに大量のテキスト(約4000〜5000文字)があります。 Firefoxでは、フィールドは3000文字目のまわりで切り捨てられています。私がオンラインで見つけたほとんどのものは、ノードの値のサイズに制限はないと言いますが、実装に依存することもあります。javascript [node] .nodeValueフィールドのサイズ制限?

nodeValueのサイズに制限がないと仮定して、なぜこれが起こっているのかについての提案はありますか?その場合の回避策はありますか?

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

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

値は切り捨てられます。

- xmlHttp.responseTextを印刷すると、すべてのデータが印刷されます。

答えて

4

チェックthis。それは言う:

"重要な点は、タグの間にどれくらいのテキストが存在しても、すべてが1つのテキストノードになければならないということですが、実際には必ずしもそうではありませんOpera 7- 9.2xおよびMozilla/Netscape 6+の場合、テキストが特定の最大サイズより大きい場合、複数のテキストノードに分割されます。これらのテキストノードは、親要素のchildNodesコレクション内で隣り合っています。

+0

素晴らしい記事 - それが解決策でした! – Jmoney38

+0

http://www.howtocreate.co.uk/もすばらしいサイトです。追加するかもしれません。 – KooiInc

1

@Kooilncは正しく、Firefoxのテキストノードに4kの制限があります。

あなたはこれを行うことによって、それを回避することができます。ここから借りhttp://jsfiddle.net/Bkemk/2/

機能:

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); 

がここにアクションでそれを参照してください。私が代わりに作ってみた何http://www.quirksmode.org/dom/tests/textnodesize.html

0

単一のノードをターゲットにする:

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; 

listOfChildTextNodes [n]要素がTextNodeであることを保証することは価値があるかもしれません。

0

@Ryley

getElementsByTagNameのとgetElementsByIdは、遠くの階層下にあるノードを返しますので、私は直接の子の上に繰り返しを行う唯一の理由です。より良い例として説明:私はfooTag.getElementsByTagNameを言うなら(「バー」)、唯一の真の子だから、私は唯一の(第2をしたいにもかかわらず、両方の配列sを返すために起こっている

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

)。この「私の直接の子供を検索する」を強制することを私が考えることができる唯一の方法は、子供を反復することです。

+0

あなたの質問には本当に関係していないようです。私はgetElementsByTagNameがあなたが記述しているように動作することに同意します。 – Ryley