querySelector
和querySelectorAll
的用法和getElementBy
大致一樣,獲取的時候帶上符號,getElementBy 獲取的是元素的動態集合
,querySelector 獲取的是元素的靜態集合
。
但是需要注意:getElementBy 系列和 querySelector 系列的區別
比如,我們寫一個 for 循環,每次獲取 li 標籤的時候,ul 生成一個 li 子元素
<ul id="ul">
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<script>
var ul = document.getElementById('ul');
var li = document.getElementsByTagName('li');
for(var i = 0;i < li.length; i++) {
ul.appendChild(document.createElement('li'))
};
console.log(li.length);
// 陷入死循環
</script>
用i < li.length
來進行判斷時,會導致瀏覽器死循環,因為循環一次的時候,瀏覽器又重新獲取 li 標籤數組,每調用一次就會重新對文檔進行查詢,就會進入死循環
進行修改:把i < li.length
改成i < 3
,把 li 標籤數組靜態化,然後打印
conosle.log(li.length) // 6
重新用 querySelector 獲取一遍元素
<ul id="ul">
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<script>
var ul = document.querySelector('ul');
var li = document.querySelectorAll('li');
for(var i = 0;i<li.length;i++) {
ul.appendChild(document.createElement('li'))
};
console.log(li.length);
// 輸出對結果是原來的li.length = 3,而不是增加後的 6
</script>
靜態集合體現在querySelectorAll('li')
獲取到 ul 裡所有 li 後,不管後續再動態添加了多少 li,都是不會對其參數影響