querySelector
与getElementById
是实战开发上最常使用的语法,但是两者使用上有什么差异呢?所以这一篇就顺便来记录跟学习一下querySelector
与getElementById
两者差异与特别之处。
document.getElementById
{#document-getElementById}
document.getElementById
主要是用来选取HTML 的DOM 元素,而语法其实也算是满白话文的,也就是「透过ID 选取DOM 元素」,因此会需要传入一个HTML ID 的属性值
<div id="test">IsRayNotArray</div>
const test = document.getElementById('test');
console.log(test); // <div id="test">IsRayNotArray</div>
以上是document.getElementById
基本的使用方式,接下来我们要来聊一下它有一些特别的地方。
-
大小写敏感
-
只能在
document
上使用
当选取的元素不存在时,会回传null
{#當選取的元素不存在時,會回傳-null}
假使你今天选取了一个不存在于HTML 画面上的元素,那么在预设状况下,document.getElementById
会回传null
,而不是undefined
<div id="test">IsRayNotArray</div>
const example = document.getElementById('example');
console.log(example); // null
只会选取第一个符合的元素 {#只會選取第一個符合的元素}
虽然我们知道HTML 上的ID 是唯一的,但是却有一个有趣的事情会发生,也就是当如果你的HTML 画面上有多个相同ID 时,HTML 并不会出现任何错误与警告,但是document.getElementById
只会选取第一个符合的元素。
<div id="test">IsRayNotArray 1</div>
<div id="test">IsRayNotArray 2</div>
const test = document.getElementById('test');
console.log(test); // <div id="test">IsRayNotArray 1</div>
大小写敏感 {#大小寫敏感}
document.getElementById
是大小写敏感的,也就是说如果你的HTML 画面上的ID 是test
,那么你在使用document.getElementById
时,也必须要使用test
,而不是Test
。
<div id="test">IsRayNotArray</div>
const test1 = document.getElementById('Test');
console.log(test1); // null
const test2 = document.getElementById('test');
console.log(test2); // <div id="test">IsRayNotArray</div>
只能在 document
上使用 {#只能在-document-上使用}
这个稍微有一点特别了,有时候我们会选取一个元素后,然后再从这个元素中选取其他元素,但是document.getElementById
只能在document
上使用,也就是说你不能这样写:
<div id="test">
<div id="example">Example</div>
</div>
const test = document.getElementById('test');
const example = test.getElementById('example');
console.log(example); // Uncaught TypeError: test.getElementById is not a function
document.querySelector
{#document-querySelector}
虽然document.querySelector
与document.getElementById
都可以做到选取HTML 的DOM 元素,但是在使用上满明显的差异,document.getElementById
只能针对ID 来选取元素,而document.querySelector
则可以针对CSS Selector 来选取元素,所以选取的方式就非常多种
<div id="test">IsRayNotArray</div>
<button class="btn">Button</button>
<div class="content">
<p>Content</p>
</div>
<input type="text" name="name" value="Ray" />
const test = document.querySelector('#test');
console.log(test); // <div id="test">IsRayNotArray</div>
const btn = document.querySelector('.btn');
console.log(btn); // <button class="btn">Button</button>\
const content = document.querySelector('.content p');
console.log(content); // <p>Content</p>
const name = document.querySelector('input[name="name"]');
console.log(name); // <input type="text" name="name" value="Ray">
我们可以看到document.querySelector
的选取方式非常的多元化,选取的方式有ID、Class、Tag、属性、属性值等等,这些都可以使用document.querySelector
来选取,可以说是非常的方便。
如果你有写过jQuery 的话,那么就会发现document.querySelector
与jQuery 的$()
选取方式是非常相似的,所以如果你有使用过jQuery 的话,那么document.querySelector
就会非常的熟悉。
以上是document.querySelector
基本的使用方式,接下来一样要来聊聊document.querySelector
的注意事项。
只会选取第一个符合的元素 {#只會選取第一個符合的元素-1}
document.querySelector
会选取第一个符合的元素,也就是说如果你的HTML 画面上有多个符合的元素,那么document.querySelector
只会选取第一个符合的元素。
<div class="test">IsRayNotArray 1</div>
<div class="test">IsRayNotArray 2</div>
const test = document.querySelector('.test');
console.log(test); // <div class="test">IsRayNotArray 1</div>
这个特性其实与document.getElementById
是一样的,所以如果你要选取多个符合的元素,那么你就必须要使用document.querySelectorAll
,但是要注意document.querySelectorAll
会回传一个NodeList
,所以你必须要使用forEach
或是for
回圈来选取。
<div class="test">IsRayNotArray 1</div>
<div class="test">IsRayNotArray 2</div>
const test = document.querySelectorAll('.test');
test.forEach((item) => {
console.log(item);
});
找不到會回傳 null
{#找不到會回傳-null}
querySelector
與 querySelectorAll
都有一個共同的特性,就是如果找不到符合的元素,那麼就會回傳 null
<div class="test">IsRayNotArray 1</div>
<div class="test">IsRayNotArray 2</div>
const test = document.querySelector('.test1');
console.log(test); // null
可以在元素上使用 {#可以在元素上使用}
刚刚前面有提到document.getElementById
只能在document
上使用,但是document.querySelector
可以在元素上使用,也就是说你可以这样写:
<div id="test">
<div class="example">Example</div>
</div>
const test = document.getElementById('test');
const example = test.querySelector('.example');
console.log(example); // <div class="example">Example</div>
大小写有区别 {#大小寫有區別}
当然document.querySelector
一样也有大小写的区别,所以如果你的HTML 画面上有这样的元素:
<div class="test">IsRayNotArray</div>
const test = document.querySelector('.Test');
console.log(test); // null
那么必定是取得不到的。
querySelector
与getElementById
{#querySelector-vs-getElementById}
在前面的许多介绍中,我们可以发现document.querySelector
与document.getElementById
都可以拿来选取元素,但是我们可以发现document.querySelector
在选取上是比较方便且弹性的,但如果以效能来讲,那么document.getElementById
的效能会比较好。
为什么呢?其主要原因是document.querySelector
大多在选取时,大多都是采用CSS 的选取方式,因此document.querySelector
会需要先解析CSS 的选取方式,然后再去选取元素,而则document.getElementById
是直接依照ID 选取元素,所以在效能上就会比较好。
但我认为这不会是抛弃document.querySelector
的理由,因为现今电脑的效能其实都非常的强大且有过剩(?)的问题,唯一有可能必须要使用的情况大概就是要选取document.getElementById
的元素非常明确且浏览器版本较旧,否则一般来说,都会建议改用document.querySelector
,毕竟真的比较方便。
document.querySelector
小技巧 {#document-querySelector-小技巧}
最后也补一个使用document.querySelector
的小技巧,但这个小技巧如果要使用在团队专案上,最好大家都要有共识会比较好,否则可能会造成开发的混乱。
首先如果假设你有使用过jQuery 的话,你会知道jQuery 在选取元素是这样选取的:
$('.test');
非常的简洁且漂亮,但是如果你要使用document.querySelector
的话,就必须要这样写:
document.querySelector('.test');
那么相对之下就非常的冗长了,所以我们可以透过宣告一个函式来建立一个$
的方法,这样就可以让我们在选取元素时,可以像jQuery 一样简洁:
const $ = (selector) => document.querySelector(selector);
这样就可以让我们在选取元素时,可以像jQuery 一样简洁:
$('.test');
当然你也可以挂在window
上,这样就可以在全域都可以使用了:
window.$ = (selector) => document.querySelector(selector);
以上就是一些小技巧的部分,可是再次强调,这个小技巧如果要用在团队专案下,还是建议要有共识比较好,否则会使用jQuery 的人可能会觉得很奇怪,那么这个小技巧就不是那么实用了,所以算是额外补充一个在自己小专案内可以使用的小技巧哩~