我正在通过AJAX调用接收XML数据。其中一个标签有大量文本,大约4000-5000个字符。在Firefox中,该字段在第3000个字符周围被截断。我在网上发现的大多数内容都表示节点值大小没有限制,但有时它依赖于实现 - 没有可靠的答案。
假设对nodeValue的大小没有限制,是否有人对此可能发生的原因有任何建议?有没有办法解决?
<test>
<foo>very long string...</foo>
</test>
value = testTag.getElementsByTagName("foo").item(0).firstChild.nodeValue;
值被截断。
- 如果我打印xmlHttp.responseText,则会打印所有数据。
答案 0 :(得分:4)
检查this。它说:
“另外需要注意的是,虽然规范说无论标签之间存在多少文本,但它都应该在一个文本节点中,实际情况并非总是如此。在Opera 7-9.2x和Mozilla中/ Netscape 6+,如果文本大于特定的最大大小,则将其拆分为多个文本节点。这些文本节点将在父元素的childNodes集合中彼此相邻。“
答案 1 :(得分: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
答案 2 :(得分: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可能是值得的。
答案 3 :(得分:0)
@Ryley
我对直接子节点进行迭代的唯一原因是因为getElementsByTagName和getElementsById将返回层次结构中更远的节点。更好地解释为一个例子:
<foo>
<bar>
<zoo>
<bar>-</bar>
</zoo>
<bar></bar>
</zoo>
如果我说fooTag.getElementsByTagName(“bar”),它将返回两个s的数组,即使我只想要第二个(因为它是唯一真正的孩子)。我能想到强制执行“只搜索我的直接孩子”的唯一方法是迭代孩子们。