document.getElementById()如何搜索DOM树?

2023-12-20

我知道有些浏览器(现在大多数?)会用一个 ID 来创建所有元素的哈希表。因此在这种情况下,对 document.getElementById() 的调用只能搜索哈希表。但是在 DOM 树的上下文中它将如何执行此操作 - 例如,它是深度优先搜索吗?

我这么问是因为我想知道放置 DOM 元素的最快位置在哪里,因此在搜索本身开始时或接近时就会在搜索中找到它。

快速浏览了一下,找不到任何有关此主题的具体信息。

非常感谢任何帮助。


由于 DOM 实现是依赖于浏览器的,因此每个浏览器可能以不同的方式实现它。浏览器也有可能拥有所有 ID 的哈希映射并执行document.getElementById使用它。

为了了解浏览器在 DOM 中查找的顺序,您可以看一下document.all包含所有 DOM 元素的简单列表的集合document。对于 Chrome、Safari 和 Firefox,它似乎是 DFS。

另一个有趣的问题是:如果同一文档中的两个元素具有相同的 ID,则返回哪一个document.getElementById。使用下面的代码片段可以看到,它是使用 DFS 算法找到的第一个元素(至少在下面提到的浏览器中)。

HTML

<div>
  <div id="id" data-index="DFS"></div>
</div>
<div id="id" data-index="BFS"></div>

JavaScript

console.log(document.getElementById('id').getAttribute('data-index'));

控制台输出

DFS

Plunker

http://plnkr.co/edit/jaUolyxwrZcXsNXwkmtm?p=preview http://plnkr.co/edit/jaUolyxwrZcXsNXwkmtm?p=preview

Edit:

关于答案评论中的附加问题

我不确定搜索是否会停止在第一个结果的位置,这当然会更快......有没有办法测试这个?

您可以在下面找到一段代码片段,该代码片段创建了 10000 个元素,一个元素又一个元素,以及一个同级元素。在一种情况下,相同的 ID 被设置为最深的元素和同级元素,而在另一种情况下,则为所有元素设置相同的 ID。第二种情况比第一种情况快约 10 倍。这证明搜索在找到第一个具有匹配 ID 的元素后停止。

JavaScript

function Div(el) {
    var div = document.createElement('div');
    el.appendChild(div);
    return div;
}

var i, body, el, t0, t1;

el = body = document.querySelector('body');
for(i=0; i<10000; i++) {
    el = new Div(el);
    el.setAttribute('id', 'ix'); // <- setting id="id" in this line will produce ~10x time difference
}
el.setAttribute('id', 'id');

el = new Div(body);
el.setAttribute('id', 'id');

t0 = performance.now();
document.getElementById('id');
t1 = performance.now();

console.log('Time to find element by ID: ' + (t1 - t0) + 'ms');

Plunker

http://plnkr.co/edit/jmGRJvq0qB7qMyyMULhz?p=info http://plnkr.co/edit/jmGRJvq0qB7qMyyMULhz?p=info

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

document.getElementById()如何搜索DOM树? 的相关文章

  • Jquery 动画与 CSS 浮动

    我的代码有问题 宽度似乎可以工作 但浮动没有 这里是 这是一个例子 http jsfiddle net v82ck http jsfiddle net v82ck 问题 悬停时菜单上的浮动属性不会改变 我希望每个菜单元素下方的线在悬停该菜单
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • IE 9 的子元素不透明,我无法使用 captify 阻止它

    好的 我正在使用一段名为 Captify 的 javascript 它为您的图像添加了一个带有文本的小弹出窗口 适用于所有接受 IE9 的浏览器 IE9 会淡化弹出 div 中的所有内容 我已阅读其子元素问题 但无法修复它 由于在网上任何地
  • 如何使用 jquery 从 iframe 内部滚动?

    我正在使用一个 Shadowbox 它生成一个 iframe 以在页面上显示产品详细信息 由于详细信息页面可能相当长 因此客户端需要一个 更多 按钮来向下滚动页面 显然 iframe 右侧的滚动条还不够 这是我为了让 iframe 滚动而尝
  • Angularjs 在生产中禁用调试数据

    我正在尝试按照角度文档中的建议禁用生产服务器中的调试数据here https docs angularjs org guide production 补充一点 我并没有真正看到性能和加载时间有任何改进 这是我的代码在 app js 中的样子
  • KineticJS - 将舞台缩放到视口

    我正在努力将默认分辨率设置为 1366x756 我会根据视口来放大和缩小它 类似于此处显示的示例 http blogs msdn com b davrous archive 2012 04 06 modernizing your html5
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • 在 AngularJS 中覆盖运行时的依赖关系

    我有一个服务叫 doggedHttp 它公开了与 http 现在我想创建一个 doggedResource服务是有角度的 resource服务之上 doggedHttp代替 http 换句话说我想注入 doggedHttp as the h
  • GeoJSON 要素坐标未显示在 OpenLayers 地图上

    我正在尝试显示一个GeoJSON地图上的多边形 我使用了 OpenLayers 提供的示例以及以下数据 但仅显示第二个多边形 var geojsonObject type FeatureCollection crs type name fe
  • HTML5 拖放 - 没有透明度?

    当我将一个元素拖放到页面上时 该元素会变成 幻影 基本上它获得了一些透明度值 有什么办法可以做到吗opacity 1 看来是做不到了 拖动的元素被放入具有自己的不透明度 低于 1 的容器中 这意味着虽然您可以降低拖动元素的不透明度 但您无法
  • Node.js 和 Express:异步操作后如何返回响应

    我是 Node js 新手 所以我仍然对异步函数和回调很感兴趣 我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是发送回复的工作方式如下 这对我有用 app get search function req res res s
  • 使用 test() 通过正则表达式进行信用卡验证

    我正在尝试完成一些作业 看来这本书可能做错了 我有一个简单的 html 页面 允许用户在我们的例子中选择信用卡 美国运通卡 然后 用户输入一个数字并根据正则表达式评估该数字 我的问题最终是当 test 计算它返回的数字时是布尔值还是字符串
  • 使用 groovy DOMBuilder 省略空属性

    格罗维的标记生成器 http groovy codehaus org api groovy xml MarkupBuilder html has an omitNullAttributes and an omitEmptyAttribute
  • 如何在流程图中间隔刻度线?

    我下面有一个流程图 您将看到标签被压缩 我想使刻度之间的宽度确保显示所有标签 标记如下 div div class graph info a href span span a a href class active span span a
  • 为什么严格模式下不允许使用八进制数字文字(解决方法是什么?)

    为什么八进制数字文字不允许JavaScript 严格模式 https developer mozilla org en docs Web JavaScript Reference Strict mode 有什么害处呢 use strict
  • 如何使用 Ansible when 条件在文件中搜索字符串

    我有一个变量中用 n 分隔的搜索字符串列表listofips 我想在文件中搜索该字符串hello csv在我的下面playbook dir 我可能遇到一些语法问题 我不确定 但下面是我尝试过的 set fact listofips 10 0
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请
  • 截断段落前 100 个字符并隐藏段落的其余内容,以通过更多/更少链接显示/隐藏其余内容

    我有一个超过 500 个字符的段落 我只想获取最初的 100 个字符并隐藏其余部分 我还想在 100 个字符旁边插入 更多 链接 单击更多链接时 整个段落应显示并编辑文本 更多 到 更少 单击 更少 时 它应切换行为 段落是动态生成的 我无

随机推荐

  • 如何获取 XGBClassifier 的预测 p 值?

    我想知道 XGBClassifier 对它所做的每个预测的置信度如何 有可能有这样的价值吗 或者 predict proba 是否已经间接成为模型的置信度 你的直觉确实是正确的 predict proba返回每个示例属于给定类别的概率 来自
  • 读取注册表项的性能?

    我想知道通过标准 C 库从 Windows 注册表读取注册表值需要多长时间 以毫秒为单位 在这种情况下 我正在阅读一些代理设置 我应该期望什么数量级的值 有没有好的基准数据可用 我正在运行 WS2k8 R2 amd64 加分点 操作系统 s
  • Django REST框架范围过滤器

    如何在 Django REST Framework 中对日期和数字进行范围过滤 其他过滤器 lt gt 等 工作正常 我尝试了很多变体 例如 import rest framework filters as filters class Or
  • 如何在 PHP 中将查询字符串转换为斜杠 URL?

    我想将 URL 转换为 http localhost projectname api index php type login to http localhost projectname api login Convert在这里不是一个常用
  • 如何统计Apache Flink在给定时间窗口内处理的记录数

    在flink中定义一个时间窗口后如下 val lines socket timeWindowAll Time seconds 5 如何计算该特定 5 秒窗口内的记录数 执行计数聚合的最有效方法是ReduceFunction 然而 reduc
  • 引用 jssc 库的可运行 jar 无法满足链接错误

    我们正在创建一个可运行的 java jar 来在 beagleboneblack 运行 ubuntu 上运行 我们创建了一个可运行的 jar 它可以在我们的 mac 和 pc windows 上运行良好 但不能在 ubuntu 系统上运行
  • Skype for Business URI 而不是 Skype

    因为我们可以选择通过提供 URI 来打开 Skype 中的链接 skype xyz call 我们可以做类似的事情来实现相同的功能 但它会在 Skype for Business 中打开吗 请告诉我 Cheers 经过大量研究后找到了解决方
  • 为什么Linq GroupBy在OrderBy之后驳回了订单操作?

    我有一个Action模型与Session导航属性 考虑这段代码 var x db Actions OrderBy p gt p Session Number ThenBy p gt p Date it s OK x 是一个有序的 Actio
  • 在 JasperReports 中以任意角度旋转文本

    我在用iReport生成pdf 我需要以任意角度旋转文本 正如我在文档中读到的那样 iReport可以将文本旋转 90 180 270 和 360 度 我也想要它的动态值 为此 我尝试了这些过程 但没有得到预期的结果 使用自定义 jar 旋
  • 删除列表项时出现意外的索引错误[重复]

    这个问题在这里已经有答案了 我是 Python 初学者 我以前学过其他语言 比如C 初学者 和JQuery 但我发现 python 中的循环非常混乱 好吧 我想实现一个简单的结果 程序将循环遍历单词列表 然后删除与first两个字母与列表中
  • 带有 MVC4 模型绑定的 Angular JS 因日期/日期时间而失败?

    当使用 Angular JS 将复杂对象的日期时间和日期时间回发到服务器时 值未正确绑定 我尝试过 JSON stringify 无济于事 我已经发布了一个相关问题 但可能太笼统了 我真正需要知道的是如何正确传递这些日期 我目前正在做的是使
  • 检测 NSString 中的电话号码

    我想从 NSString 中提取电话号码 例如 在字符串中致电约翰 994 456 9966 我想提取994 456 9966 我尝试过类似的代码 NSString nameRegex d 3 s d 3 s d 4 NSPredicate
  • 使用 IIS7 URL 重写模块强制使用 HTTPS 并避免重复的 URL

    我需要强制每个请求https www mysite com https www mysite com 始终带有 https 和 www 该网站托管在 GoDaddy 中 我需要通过 IIS7 URL 重写模块来完成此操作 我已经能够使用以下
  • 维护asp.net、C#中Fileupload控件的值

    我在更新面板中使用 Fileupload 和 3 个下拉控件 3 个下拉列表将在下拉所选索引更改事件上回发 即 国家 州和城市 根据国家 州和城市从数据库获取值 问题是 回发时 文件名路径将从文件上传控件中消失 如预期 或默认属性 我正在将
  • DocuSign Connect Webhook 不包括 HMAC 标头

    我已经参考过this https stackoverflow com questions 56673644 docusign connect webhook call did not include hmac header x docusi
  • Inno Setup 和 VC Redistributable 并优雅地处理退出代码 3010

    In my CurStepChanged我有一些安装 Visual Studio Redistributable 的代码 如果需要 代码片段 if bVcRedist64BitNeeded then begin if Exec Expand
  • 如何将栅格更改为特定的空间分辨率?

    我想更改光栅的分辨率 例如 我们以 此 Landsat 7 图像分辨率约为 30m library terra gt terra 1 5 21 f lt system file tif L7 ETMs tif package stars r
  • Maven 在发布时不会复制未跟踪的资源

    我的问题是关于使用 maven 进行发布时要包含在 jar 文件中的资源 我正在使用 Maven 来构建我的项目 当我运行时 mvn package 资源包含在输出 jar 中 但当我跑步时 mvn release prepare mvn
  • ASP.NET 4 MVC 的身份模拟未按预期工作

    我正在为我们的分析师构建一个 Intranet MVC 4 应用程序 目标是允许内部用户访问此应用程序 而无需登录 因为他们是我们内部网络的一部分 当他们访问应用程序时 我希望能够捕获他们的 Windows 用户名并使用 LDAP 检查活动
  • document.getElementById()如何搜索DOM树?

    我知道有些浏览器 现在大多数 会用一个 ID 来创建所有元素的哈希表 因此在这种情况下 对 document getElementById 的调用只能搜索哈希表 但是在 DOM 树的上下文中它将如何执行此操作 例如 它是深度优先搜索吗 我这