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

2024-03-22

Target

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

Method

满足上述所有要求之一

  • document.createTreeWalker() https://developer.mozilla.org/de/docs/Web/API/Document/createTreeWalker or
  • document.createNodeIterator() https://developer.mozilla.org/de/docs/Web/API/Document/createNodeIterator

我不完全理解为什么这些相似的功能没有合并在一起。但是,作为createTreeWalker()有更多的API方法我已经开始使用它了。

然后我发现根据文档 https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker, the acceptNodeIE9不支持过滤功能。因此我切换到createNodeIterator,根据文档 https://developer.mozilla.org/en-US/docs/Web/API/Document/createNodeIterator.

这是我用来循环元素的代码:

<!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>

虽然在这种情况下循环实际上(几乎)没有执行任何操作,但在我的实际应用程序中它确实执行了操作。所以请将此作为示例。

Issue

问题是上面的方法在 IE9 中不起作用。似乎是acceptNode过滤回调属性createNodeIteratorIE9 也不支持。一定是null上班。然而,正如文档所说,它是受支持的,我希望它能够工作。

我的期望:

实际消息:

Question

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


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

如果您查看 W3C 文档文档对象模型级别 2 遍历和范围 https://www.w3.org/TR/DOM-Level-2-Traversal-Range/Overview.html更具体地说,附录 C 涉及ECMAScript 语言绑定 https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ecma-script-binding.html,NodeFilter对象定义如下:

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

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

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

Firefox 中的结果将是:

在 Chrome 中您将得到:

在 IE 中,您将拥有:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当指定acceptNode时,createNodeIterator在IE9中失败 的相关文章

  • 使用 JavaScript 格式化日期

    JavaScript 中的日期格式有问题 这是我的函数代码 originalDate 2016 03 02 09 12 14 989522 var d new Date originalDate month d getMonth 1 day
  • javascript:全局变量泄漏

    每当我向 Firefox 提交插件时 我都会收到一封电子邮件 告诉我我的一些变量正在泄漏到全局范围内 一旦他们告诉我我解决了问题 但在那之前有什么方法 程序 来检查变量是否泄漏到全局范围内 Thanks Both JSLint http w
  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • jQuery UI Datepicker 奇怪的行为

    我在使用 jqueryUI 使用简单的日期选择器时遇到了一个奇怪的问题 我只想显示两个月的日历 包括上个月和当前月份 我使用了这段代码 function picker datepicker numberOfMonths 2 showCurr
  • 角度垫排序不适用于带点表示法的 matColumnDef

    我正在尝试按列对表进行排序 当我必须过滤另一个结果中的结果时 就会出现问题 我尝试通过括号表示法和点表示法访问该属性 但没有给出结果 还将最终节点放置在 matColumnDef 中 但失败 因为有 2 列同名 table table
  • 如何在 jQuery 中将标题转换为 URL slug?

    我正在 CodeIgniter 中开发一个应用程序 我试图在表单上创建一个字段来动态生成URL slug 我想做的是删除标点符号 将其转换为小写 然后用连字符替换空格 例如 Shane s Rib Shack 将变成 shanes rib
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https
  • fadeOut() 和slideUp() 同时进行?

    我已经发现jQuery 淡出然后滑动 https stackoverflow com questions 734554 jquery fadeout then slideup这很好 但不是那个 我怎么能够fadeOut and slideU
  • 如何在 JavaScript 中将变量的内容写入文件[重复]

    这个问题在这里已经有答案了 可能的重复 firefox 如何启用本地 JavaScript 来读取 写入我的 PC 上的文件 https stackoverflow com questions 2846045 firefox how to
  • Rangy:插入符号下的单词(再次)

    我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器 基本上 我需要能够插入人员 标签引用 例如 Twitter Github Facebook 我发现一些人试图实现同样的事情的代码 http jsfiddle net A
  • 非法使用break语句; javascript

    当这个变量达到一定数量时 我希望循环停止 但我不断收到错误 未捕获的语法错误 非法的中断语句 function loop if isPlaying jet1 draw drawAllEnemies requestAnimFrame loop
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d
  • 如何使用 GreaseMonkey 让浏览器恢复“/”键?

    Lots of web pages seem to use the key for searching I d like to disable that because 100 of the time I want to use to se
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 如何使用 jQuery 单击特定链接时打开引导导航选项卡的特定选项卡?

    我是 jquery 和 bootstrap 的新手 所以请考虑我的错误 我已经创建了一个用于登录和注册的 bootstrap 模式 它包含两个导航选项卡 称为登录和注册 我有两个按钮可以弹出相同的模态窗口 但在模态窗口内显示不同的选项卡 每
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than

随机推荐

  • PHP:如何对字符串中的字符进行排序?

    我有一组包含 PHP 脚本中的字符的字符串 我需要对每个字符串中的这些字符进行排序 例如 bac gt abc abc gt abc gt poeh gt ehop 这些字符没有重音符号并且都是小写 我如何在 PHP 中执行此操作 我会将其
  • 使用 STL 在向量中的位置

    我试图使用 STL 查找算法 和 min element 算法 来定位向量中最小值的位置 但它不是返回位置 而是只是给我值 例如 如果最小值是它 则位置将返回为 8 等 我在这里做错了什么 int value min element v2
  • 如何在 pyopengl 中添加图像作为 3D 立方体的纹理

    如何在我的立方体中添加图像作为纹理 我想添加我自己提供的图像作为立方体的表面 同时仍然有一些照明 我使用 Visual Studio Code 作为我的编译器 这是我复制的代码 import pygame from pygame local
  • Heroku 无法在我的 Ruby on Rails 应用程序中找到文件 - 即使它们就在那里?

    当我尝试访问我的网站 然后检查我的 Heroku 日志时 我看到以下错误 ActionView Template Error 找不到文件 重置 2012 06 13T02 31 43 00 00 应用程序 web 1 在 app app a
  • 如何在 PostgreSQL 中创建位图索引? (它甚至有位图索引吗?)

    我已经 谷歌搜索 了至少一个小时 但我无法找到如何在 PostgreSQL 中创建位图索引 所以我的问题很简单 如何在 PostgreSQL 中编写这个命令 来自 Oracle CREATE BITMAP INDEX name ON tab
  • 是否可以使用 appcompat 库提供操作栏菜单?

    最近 我从常规操作栏实现切换到最近发布的 appcompat 实现 我的应用程序大量使用操作栏来提供功能 自从切换以来 在较旧的地点 API 少于 11 个 没有任何菜单项 较新的 API 可以 但它们不会像配置的那样显示图像 如果 roo
  • 如何操作数组以获得最大的数字?

    假设您有一个正整数数组 对它们进行操作 以使结果数组的整数的串联成为可能的最大数字 例如 9 1 95 17 5 结果 9955171 作业警察 这是一个谷歌电话面试问题 没有签署保密协议 正如其他人指出的那样 字典排序和串联很接近 但并不
  • Angular.js 更复杂的条件循环

    目标是创建这个 h3 11 4 2013 h3 ul li entry 1 li li entry 2 li li entry 3 li ul h3 10 4 2013 h3 ul li entry 4 li li entry 5 li l
  • Angular 2 - 消除 keyUp 事件的抖动

    如何消除在 keyUp 事件上调用的函数 这是我的代码 我的功能 private handleSearch searchTextValue string skip number void this searchTextValue searc
  • 使用 LiveData 从网络刷新数据

    我正在开发一个应用程序 该应用程序查询 github api 以获取用户列表 并且我正在遵循推荐的 android架构组件指南 https developer android com jetpack docs guide 从网络获取数据后
  • 适用于 Android 的 Firebase 实时(在线)数据库有多安全?

    我最近才开始使用 Googlefirebase http firebase google com 作为 Android 应用程序数据的在线集中数据库 从使用本地 sqlite 迁移 作为 firebase 的新手 我想问一下 android
  • Java泛型方法签名解释

    这个通用方法签名意味着什么 public
  • 检查字符串是否包含电子邮件地址?

    如何检查以验证给定字符串是否包含电子邮件地址 电子邮件地址也会包含在许多其他文本中 此外 并不希望严格验证电子邮件地址本身 更重要的是想确保 email protected cdn cgi l email protection存在 示例字符
  • С++ 中的字符串文字是在静态内存中创建的吗?

    C 中的字符串文字是否在静态内存中创建并仅在程序退出时销毁 是的 字符串文字在程序的整个持续时间内都有效 即使在静态对象销毁期间也是如此 标准中的2 13 4 1说 普通字符串文字具有 n const char 数组 类型和静态存储持续时间
  • PHP 中与数值数组的关联

    我有一个关联数组 我想在数字中使用哪些键 我的意思是 数组有点像这样 countries array AD gt array AND Andorra BG gt array BGR Bulgaria 显然AD是0 BG是1 但是当我打印时
  • br 在 ul 中无效

    我的网站上有一个导航栏 HTML
  • 在mathematica中使用Input[]输入数据

    我怎样才能在这段代码中使输入命令对话框中的文本像这样 输入 1 元素 输入 2 元素 For k 1 k n k br Input Enter the i element AppendTo x br 确保您的变量匹配 您可以使用Row来构建
  • 为什么 Ruby 的“gets”包含结束换行符?

    我从不需要我得到的结尾换行符gets 有一半的时间我忘记了chomp它是一种痛苦 为什么它在那里 Like puts 听起来很相似 它被设计为与线条一起工作 使用 n特点 gets接受一个可选参数 用于 分割 输入 或 只是读取直到它到达
  • 页面不工作 尝试解锁被另一个线程锁定的互斥体

    我想启动我的应用程序 但它仍在 加载 早上还可以 现在不行了 我尝试使用其他端口 切换到稳定分支 重新启动计算机 但似乎没有任何效果 在其他应用程序上 它可以正常工作 如果我停止服务器 这就是我看到的错误 在浏览器中 Attempt to
  • 当指定acceptNode时,createNodeIterator在IE9中失败

    Target 我想循环遍历 DOM 文本节点 按它们在 DOM 中的顺序排序 此外 我想通过自定义逻辑过滤节点 例如检查节点是否位于特定元素内 此外 所有这些都应该在 IE9 中以尽可能最佳的性能完成 Method 满足上述所有要求之一 d