JavaScript中[node].nodeValue字段的大小限制是多少?

3

我通过AJAX调用接收XML数据。其中一个标签包含大量文字,约4000-5000个字符。在Firefox中,该字段在第3000个字符左右被截断。大多数在线资源都表示节点值大小没有限制,但有时与实现相关 - 没有确定的答案。

假设节点值大小没有限制,有没有人有关于为什么会发生这种情况的建议?如果有的话,是否有任何解决方法?

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

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

数值被截断。

-如果我打印xmlHttp.responseText,所有数据都会被打印出来。

4个回答

4

请查看此文。它说:

"还要注意的是,虽然规范中说无论在标签之间有多少文本,它们都应该被视为同一个文本节点,在实际情况下却不总是如此。在Opera 7-9.2x和Mozilla/Netscape 6+中,如果文本大于特定的最大大小,它将被分成多个文本节点。这些文本节点将依次出现在父元素的childNodes集合中。"


很棒的文章 - 那就是解决方案! - Jmoney38

1

@Kooilnc说得对,在Firefox中文本节点的限制是4k。

您可以通过以下方式解决这个问题:

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://jsfiddle.net/Bkemk/2/

函数从这里借来的: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会返回层次结构较深的节点。最好通过示例进行解释:

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

如果我说fooTag.getElementsByTagName("bar"),它将返回一个包含两个元素的数组,即使我只想要第二个(因为它是唯一的真正的子元素)。我能想到的唯一强制执行“仅搜索我的直接子元素”的方法是迭代子元素。

这似乎并不与您的问题相关。我同意getElementsByTagName的行为与您描述的方式相符。 - Ryley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接