目标

我想遍历DOM文本节点,并按其在DOM中的顺序排序。此外,我想通过自定义逻辑过滤节点(例如,检查节点是否在特定元素内)。此外,所有这些都应以最佳性能完成并在IE9 +中运行。

方法

满足上述所有要求


document.createTreeWalker()
document.createNodeIterator()


我不完全理解为什么这些类似功能没有合并在一起。但是,由于createTreeWalker()具有更多的API方法,因此我开始使用它。

然后我发现,根据documentation,IE9不支持acceptNode过滤器功能。因此,我切换到了createNodeIterator,根据documentation,它没有此限制。

这是我用来遍历元素的代码:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Test</title>
    </head>
<body>
    <div class="context">
      Root first
        <div>
          Child
        </div>
      Root second
    </div>

    <script type="text/javascript">
        var treeWalker = document.createNodeIterator(
            document.querySelector(".context"),
            NodeFilter.SHOW_TEXT,
            {
                acceptNode: function(){
                    return NodeFilter.FILTER_ACCEPT;
                }
          },
          false
        );

        var nodeList = [];
        var currentNode;
        while (currentNode = treeWalker.nextNode()){
            nodeList.push(currentNode);
        }

        console.log(nodeList);

    </script>
</body>
</html>


虽然在这种情况下,循环实际上(几乎)没有任何作用,但在我的实际应用程序中却有作用。因此,请参阅此示例。

问题

问题是以上内容在IE9中不起作用。似乎IE9也不支持acceptNodecreateNodeIterator过滤器回调属性。它必须是null才能工作。但是,正如文档所说的那样,我希望它能正常工作。

我的期望:

javascript - 指定acceptNode时,IE9中的createNodeIterator失败-LMLPHP

实际消息:

javascript - 指定acceptNode时,IE9中的createNodeIterator失败-LMLPHP



这里有什么问题以及如何解决?注意,我绝对需要循环。

最佳答案

我实际上在IE11中有完全相同的错误。

如果查看有关Document Object Model Level 2 Traversal and Range的W3C文档,更具体地说是有关ECMAScript Language Binding的附录C,则NodeFilter对象的定义如下:


  这是ECMAScript函数参考。此方法返回一个数字。该参数是Node对象。


因此,如果更新脚本以传递功能而不是带有键acceptNode的对象,则将获得预期的结果。

var treeWalker = document.createNodeIterator(
    document.querySelector(".context"),
    NodeFilter.SHOW_TEXT,
    function(){
        return NodeFilter.FILTER_ACCEPT;
    },
    false
);


Firefox中的结果将是:

javascript - 指定acceptNode时,IE9中的createNodeIterator失败-LMLPHP

在Chrome中,您将获得:

javascript - 指定acceptNode时,IE9中的createNodeIterator失败-LMLPHP

在IE中,您将拥有:

javascript - 指定acceptNode时,IE9中的createNodeIterator失败-LMLPHP

我没有修改您的循环或其他任何方式来获得这些结果,所以我只发布了相关部分。

关于javascript - 指定acceptNode时,IE9中的createNodeIterator失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38245898/

10-16 19:45