javascript - 当指定acceptNode时,createNodeIterator在IE9中失败

标签 javascript internet-explorer dom iterator treenode

目标

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

方法

满足上述所有要求

我不完全理解为什么这些类似的功能没有合并在一起。但是,由于 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 似乎也不支持 createNodeIteratoracceptNode 过滤器回调属性。它必须为 null 才能工作。然而,正如文档所说,它是受支持的,我希望它能够工作。

我的期望:

Expect

实际消息:

Actual

问题

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

最佳答案

我实际上在 IE11 中遇到了完全相同的错误。

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

This is an ECMAScript function reference. This method returns a Number. The parameter is a Node object.

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

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

Firefox 中的结果将是:

Firefox result

在 Chrome 中,您将获得:

Chrome result

在 IE 中,您将拥有:

IE result

我没有修改您的循环或其他任何内容来获得这些结果,因此我只发布了相关部分。

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

相关文章:

java - 从旧 Java 过渡到 Play、Servlet 问题

internet-explorer - IE 中可怕的 iframe 水平滚动条无法删除?

qt - QDomDocument 无法使用 &lt;!doctype> 标签设置 HTML 文档的内容

JavaScript 数学验证不正确

javascript - 即使使用了 preventDefault,也检测 onmouseup/onmousemove

javascript - 添加/删除产品以与 Jquery 进行比较

html - 背景在 IE 上不完全显示

css - Firefox v42+ 是否支持 CSS 网格?

javascript - 如何选择位于 DOM 层次结构特定范围内的元素?

在另一个 HTML 页面上显示 HTML 值的 JavaScript