繁体   English   中英

为什么querySelector('#id')映射到document.getElementById('id')?

[英]Why doesn't querySelector('#id') map to document.getElementById('id')?

我最近进入了选择器性能,当我传递一个简单的#id时,当前实现Selectors API的浏览器不使用document.getElementById ,这让我很#id

性能损失是巨大的 ,因此图书馆作者继续以自己的方式实现。

有任何想法吗?

在做出上述评论后,我决定遵循:

来自Chromium源中的Node.cpp

if (strictParsing && inDocument() && querySelectorList.hasOneSelector() && querySelectorList.first()->m_match == CSSSelector::Id) {
    Element* element = document()->getElementById(querySelectorList.first()->m_value);
    if (element && (isDocumentNode() || element->isDescendantOf(this)) && selectorChecker.checkSelector(querySelectorList.first(), element))
        return element;
    return 0;
}

因此它确实映射到getElementById,只是解析查找选择器的字符串是一项昂贵的操作。

TBH。 性能损失是微不足道的......我真的怀疑你每秒会做100,000次id查找,如果你这样做,那么QSA性能实际上是你应该看的最后一件事。

至于为什么,添加一个额外的if / else可能会使id查找更高效,但是其他css选择器将会变得更慢(仍然无关紧要)。 为什么要优化QSA来处理id查找,而有专门的方法可以更快地完成更快的任务。

无论如何,浏览器的目标是速度,而忽略这样的东西会使整体性能图表看起来好多了。 在这个基准测试中,它几乎每一毫秒,但对于开发人员......请务必,其他基准测试更重要,QSA性能不再是一个因素。

至于开发人员的方便,它可以工作,它仍然是如此之快,你不会在实际应用程序中注意到它(我挑战你告诉我它在哪里是显而易见的,同时仍然是一个理智的程序; o)。

我正在比较getElementById()querySelector() ,发现有人已经进行了性能比较和计算

看起来好像querySelector() 每次都获胜......而且相当多

也许是因为如果他们这样做,他们将不得不增加一个检查,看看它的一个简单的ID查询(无修饰符),这将每隔查询慢下来? 这项测试可能不是一个巨大的性能影响,但很难为其他开发人员说话。

我想如果你担心它,你可以添加一个func,如getObByID,用于检查文档,getElementById,如果它存在则使用它,否则使用选择器。 也许开发人员觉得不需要在自己轻松完成时添加这种类型的抽象,开发人员应该记住使用它,并增加学习曲线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM