TreeWalker不会遍历<iframe>文档</iframe>

时间:2014-01-28 10:37:02

标签: javascript dom iframe

我正在编写一个脚本来从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结合起来。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

也许您将其用于iframe或类似产品

var documentLikes = query.OfType<DocumentLike>();

使用iframe创建树。

喜欢

window.frames[0].document.createTreeWalker(
        window.frames[0].document.body

在iframe中。