先看下面一個小例子的結果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> ul,li{list-style:none;} </style> </head> <body> <div id="wrap"> <ul id="list"></ul> </div> <script> var oList = document.querySelector('#list'); var lis1 = oList.querySelectorAll('li'); var lis2 = oList.children; console.log(lis1.length);//0 console.log(lis2.length);//0 function createLi(){ for(var i=0; i<10; i++){ var li = document.createElement('li'); li.innerHTML = i; oList.appendChild(li); } } createLi(); console.log(lis1.length);//0 console.log(lis2.length);//10 </script> </body> </html>
從上面的結果我們發現,我們發現同樣是一開始就獲取了ul的子列表,但是通過.querySelectorAll獲取的子列表,在創建列表前和創建列表后,長度都為0,而通過.children方法獲取的字列表,在列表創建前,長度為0,而創建之后,長度為10,為什么呢?
使用.children獲取的是元素對象是一個實時更新的列表 可以看做一個數組對象 而使用querySelectorAll獲取的是NodeList 與其他方式獲取的NodeList不同 它不是節點集合 而是元素集合 並且是靜態的 不會實時更新 相當於克隆了一個新數組
所以,我們在使用的時候要注意了哦,如果想要實時獲取列表的變化,可以使用.children,反之,則使用.querySelectorAll(當然也包括getElementsByClassName和getElementsByTagNama)
childNodes也和children一樣是實時獲取元素的字列表(但兩者還是有區別的,這里不再詳細敘說,關於兩者的區別網上有很多啦)
---------------------
原文:https://blog.csdn.net/lhjuejiang/article/details/80615054