3

AJAX 呼び出しを介して XML データを受信して​​います。タグの 1 つに、約 4000 ~ 5000 文字の大量のテキストが含まれています。Firefox では、フィールドが 3000 番目の文字付近で切り捨てられています。私がオンラインで見つけたほとんどすべては、ノード値のサイズに制限がないことを示していますが、実装に依存する場合があります-確かな答えはありません.

nodeValue のサイズに制限がないと仮定して、これが発生する理由について何か提案はありますか? もしそうなら、回避策はありますか?

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

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

値は切り捨てられます。

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

4

4 に答える 4

4

これを確認してください。それは言います:

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

于 2010-12-10T17:23:00.703 に答える
1

@Kooilnc has it right, 4k limit on text nodes in Firefox.

You can work around it by doing this:

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

See it in action here: http://jsfiddle.net/Bkemk/2/

Function borrowed from here: http://www.quirksmode.org/dom/tests/textnodesize.html

于 2010-12-10T18:39:59.443 に答える
0

@ライリー

直接の子に対して反復を行う唯一の理由は、getElementsByTagName と getElementsById が階層のさらに下にあるノードを返すためです。例としてよりよく説明します:

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

fooTag.getElementsByTagName("bar") と言うと、2 番目だけが必要な場合でも、両方の の配列が返されます (これは の唯一の真の子であるため)。この「直接の子のみを検索する」ことを強制する唯一の方法は、子を反復処理することです。

于 2010-12-10T20:03:26.743 に答える
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 であることを確認することも価値がある場合があります。

于 2010-12-10T18:51:03.887 に答える