我正在编写一个脚本来从HTML文档中检索文本节点(和其他相关元素)。根据{{3}},我使用了以下内容。 (为简单起见,省略了acceptTextNode
函数的定义。)
var textNodes = [];
var treeWalker = document.createTreeWalker(
rootNode,
NodeFilter.SHOW_ALL,
{ acceptNode: acceptTextNode });
while (treeWalker.nextNode())
textNodes.push(treeWalker.currentNode);
但是,我发现当文档包含嵌套在<iframe>
元素中的其他文档时,例如Outlook.com中的“撰写”工具,此方法会失败。 (假设<iframe>
文档的域与父文档相同。)
我设法通过使用getElementsByTagName
手动检索后代文档来解决此问题:
var textNodes = [];
var rootNodes = [ rootNode ];
for (var i = 0; i < rootNodes.length; i++)
{
if (rootNodes[i].getElementsByTagName)
{
var childFrames = rootNodes[i].getElementsByTagName("iframe");
for (var j = 0; j < childFrames.length; j++)
if (childFrames[j].contentDocument)
rootNodes.push(childFrames[j].contentDocument);
}
}
for (var i = 0; i < rootNodes.length; i++)
{
var treeWalker = document.createTreeWalker(
rootNodes[i],
NodeFilter.SHOW_ALL,
{ acceptNode: acceptTextNode });
while (treeWalker.nextNode())
textNodes.push(treeWalker.currentNode);
}
然而,这感觉就像一个黑客,因为它将手动遍历与内置TreeWalker
结合起来。有更好的方法吗?
答案 0 :(得分:0)
也许您将其用于iframe或类似产品
var documentLikes = query.OfType<DocumentLike>();
使用iframe创建树。
喜欢
window.frames[0].document.createTreeWalker(
window.frames[0].document.body
在iframe中。