【问题标题】:Size limit to javascript [node].nodeValue field?javascript [node].nodeValue 字段的大小限制?
【发布时间】:2011-05-23 14:41:16
【问题描述】:

我通过 AJAX 调用接收 XML 数据。其中一个标签包含大量文本,大约 4000-5000 个字符。在 Firefox 中,该字段在第 3000 个字符左右被截断。我在网上找到的大多数东西都说节点值大小没有限制,但有时它取决于实现 - 没有可靠的答案。

假设对 nodeValue 的大小没有限制,是否有人对为什么会发生这种情况有任何建议?如果是这样,有什么解决方法吗?

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

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

值被截断。

-如果我打印 xmlHttp.responseText,则打印来自的所有数据。

【问题讨论】:

    标签: javascript ajax nodevalue


    【解决方案1】:

    检查this。它说:

    “另外需要注意的是,虽然规范说无论标签之间存在多少文本,都应该在一个文本节点中,但实际上并非总是如此。在 Opera 7-9.2x 和 Mozilla /Netscape 6+,如果文本大于特定的最大大小,则将其拆分为多个文本节点。这些文本节点将在父元素的 childNodes 集合中彼此相邻。"

    【讨论】:

    • 很棒的文章 - 这就是解决方案!
    【解决方案2】:

    @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

    【讨论】:

      【解决方案3】:

      我想出的不是针对单个节点:

      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。

      【讨论】:

        【解决方案4】:

        @Ryley

        我对直接子级进行迭代的唯一原因是因为 getElementsByTagName 和 getElementsById 将返回层次结构中更远的节点。更好地解释为一个例子:

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

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

        【讨论】:

        • 这似乎与您的问题无关。我同意 getElementsByTagName 按照您描述的方式行事。
        最近更新 更多