【发布时间】:2014-11-01 03:47:32
【问题描述】:
每个人都知道像 document.getElementByID(...) 和 document.querySelector(...) 这样的 DOM 选择器是做什么的,以及如何将它与类、属性、id 等一起使用。
但我无法找到它是如何工作的(我可以找到perf test comparisons,但我对理论很感兴趣)。我知道 html 页面已加载,由浏览器解析并构建了 DOM 树。但是每个选择器如何遍历 DOM 树来查找元素。
我查看了spec for parsing algorithm 并阅读了非常好的explanation how Browsers work,但它也对 HTML、CSS 解析和渲染流程给出了很好的解释,它没有解释每个选择器如何遍历这棵树来查找要素。
我假设为了找到像.black 或span 这样的东西,它需要遍历整个树,但是要找到#id,它可能会遍历一些额外的数据结构,从而使其更快。请不要写你的假设,我正在寻找具体的知识,并在某些浏览器中备份规范或实现。
【问题讨论】:
-
我认为这个问题最好在programmers.stackexchange.com
-
这是一个实现细节,会因您使用的引擎而异。如果你想知道,你必须阅读各种实现的源代码。以en.wikipedia.org/wiki/List_of_ECMAScript_engines 为起点。
-
浏览器的工作方式只能由编写它们的人指定,并且每个人都可能不同。各种规范没有定义实现细节,只定义了它们必须如何工作。像 MDN 和 MSDN 这样的网站不会提供关于浏览器内部的启示。例如。我猜浏览器会创建一个 ID 索引以供 getElementById 使用,并且可能与流行的 CSS 选择器(如类和标记名)类似,但找到一个规范来定义这可能是一个挑战。跨度>
-
@salvadordali 同意......但你说的是“具体知识”,这只能通过阅读源代码获得。也许知道引擎实现的人会回复,但即便如此,您也只能获得关于一种实现的具体知识。
-
@SalvadorDali - 如果你想知道他们是如何“在幕后”做到这一点的,这里是为 Webkit 处理 DOM 的源代码:trac.webkit.org/browser/trunk/Source/WebCore/dom 和 Gecko:lxr.mozilla.org/mozilla/source/content/base/public
标签: javascript dom internals selectors-api