javascript getElementById与getElementsByClassName与查询选择器

zdwk9cvp  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(134)

我正在阅读dev.mozilla中的dom操作主题,我遇到了一个建议我们使用querySelector进行元素选择的语句:
请注意,与JavaScript中的许多事情一样,有许多方法可以选择元素并将其引用存储在变量中。document.querySelector()是推荐的现代方法...
然而,当我创建一个test时,我意识到getElementsByClassName()是目前为止最好的元素选择方法。为什么比getElementById()还快?为什么mozilla开发指南仍然推荐使用querySelector(),即使它是其中最慢的一个?

6ju8rftf

6ju8rftf1#

document.querySelector的主要优点是易于使用更复杂的CSS查询。

const loginFields = document.querySelector("form.login input");
if (loginFields.some((field) => field.value.trim() === "") {
    alert("Please fill in all fields");
}

另一种方法是使用document.getElementsByClassNameElement.getElementsByTagName

const loginFields = document.getElementsByClassName(".login")[0]
    .getElementsByTagName("input");
if (loginFields.some((field) => field.value.trim() === "") {
    alert("Please fill in all fields");
}

正如你可能已经注意到的,你经常会将返回结果存储到一个常量/变量中。你(通常)不应该在for/while循环中调用这个。
关于(archived) performance test,它看起来很不公平,因为除了类测试之外的所有测试都将运行两个查询。

所以我决定做更多的测试。在该页面的HTML中,我将id“codeOne”添加到类为“code”的第一个元素中。

我做了四个测试。

从这些测试结果中,我可以得出结论,**getElementById using id(691 ms)**是明显的赢家,querySelector using id(749 ms)排在第二位。这是因为id很容易查找,因为浏览器从Internet Explorer复制了此功能,Internet Explorer是过去最占主导地位的浏览器。你甚至可以把id当作变量来使用。

请不要这样做,因为它的可读性较低。它也不是更快。
我们看一下使用class进行的测试,可以看到getElementsByClassName(778 ms)querySelector(1460 ms)之间的性能差异非常大。这是因为前者只会查找className,而后者会做一些额外的检查,因为它可以使用像'#id.class[attr=“value”]'或“form > input”这样的复杂查询。
最后一个结论是,您可以对一个元素使用document.querySelector,对多个元素使用document.querySelectorAll,这只是为了简单起见,因为任何CSS查询都可以工作。函数getElementById和getElementsByClassName(以及getElementsByTagName,不包括在内)在理论上应该总是更快,但在实践中这不应该影响网站的性能。你(可能)不会在循环中调用这些函数,所以你可以把结果存储在一个变量中。

相关问题