原因是动态集合中DOM结构的变化能够自动反映到所保存的对象中,最开始p.legth=4,当i=0时删除了页面中第一个p元素,此后p.length=3;i=1时删除了剩余的三个p中的项目索引为1的项,此后p.length=2;i=2时已不满足i<p.length这一条件,所以不会继续执行循环。至此只删除了页面上的第一和第三个p元素,所以打印p得到了一个长度为2的HTMLCollection动态集合,其中包含"hello dolby"和"hello bean",p的变化也实时反映到了动态集合div中,所以才有(1)处的打印结果。
那么怎样才能遍历类数组对象HTMLCollection集合中的每一项并且删除所有项呢?
还是一个for循环搞定⬇️,每次删除对象集合中的最后一项就可以啦~
//js代码二 <script> var div = document.getElementsByClassName("myDiv")[0]; console.log(div); //(5) var p = document.getElementsByClassName("myP"); for (var i=p.length;i--;){ div.removeChild(p[i]); } console.log(p); //(6) </script>
//(5)处打印值 <div></div> //(6)处打印值 [] //空的HTMLCollection集合,长度为0
3、getElementsByTagName():
接收一个参数:要取得的元素的标签名(不区分大小写),返回一个HTMLCollection动态集合(也可以说返回一个NodeList类数组对象),集合中包含以当前元素为根节点(不包括当前元素自身),所有指定标签名的子元素,子元素的顺序是在当前元素的子树中出现的顺序,如果没有搜索到元素则集合为空。
语法:
elements = element.getElementsByTagName(tagName)
示例:
// check the alignment on a number of cells in a table. var table = document.getElementById("forecast-table"); var cells = table.getElementsByTagName("td"); for (var i = 0; i < cells.length; i++) { var status = cells[i].getAttribute("data-status"); if ( status == "open" ) { // grab the data } }
示例:删除
<body> <div> <p>hello world</p> <p>hello dolby</p> <p>hello dot</p> <p>hello bean</p> </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(7) var p = document.getElementsByTagName("p"); //以下for循环改为for (var i=0,len=p.length;i<len;i++) {div.removeChild(p[0]);}也可;将集合p的长度赋值给变量len,这样len就是一个固定值,每次都删除当前集合项目索引为0的项,就可以循环遍历删除掉集合里的所有项。 for (var i=p.length;i--;){ div.removeChild(p[i]); } console.log(p); //(8) </script> </body>
与getElementByClassName相同,返回动态集合,所以循环删除结果也相同
//(7)处打印值 <div></div> //(8)处打印值 [] //空的HTMLCollection集合,长度为0
4、getElementsByName():
接收一个参数:带有给定name属性值的元素,返回一个动态NodeList类数组对象,对象中包含以当前元素为根节点,所有指定name属性值的子元素。最常用的场景是取得单选按钮。
示例:
<!DOCTYPE html> <html lang="en"> <head> ... </head> <body> <form><input type="text"></form> <div><input type="text"></div> <script> var up_forms = document.getElementsByName("up"); console.log(up_forms[0].tagName); // returns "FORM" </script> </body> </html>
示例:删除
<body> <div> <input type="radio">red <input type="radio">green <input type="radio">blue </div> <script> var div = document.getElementById("myDiv"); console.log(div); //(9) var ipt_favCol = document.getElementsByName("fav-color"); for (var i = ipt_favCol.length; i--;) { div.removeChild(ipt_favCol[i]); } console.log(ipt_favCol); //(10) </script> </body>
getElementByName返回的是一个NodeList动态集合
//(9)处打印值 <div> "red" "green" "blue" </div> //(10)处打印值 [] //空的NodeList集合,长度为0
5、querySelector():
接收一个参数:一个包含一个或多个CSS 选择器的字符串(多个选择器以逗号分隔),返回匹配指定CSS选择器的第一个元素节点(无法选中CSS伪元素),没有发现匹配的节点则返回null。
语法:
element = document.querySelector(selectors);
示例:一个强大的选择方式
<div> <input/> //这个标签将被返回 </div> <script> var el = document.querySelector("div.user-panel.main input[name=login]"); </script>
示例:如果要匹配的ID或选择器不符合 CSS 语法(比如不恰当地使用了冒号或者空格),你必须用反斜杠将这些字符转义。由于 JavaScript 中,反斜杠是转义字符,所以当你输入一个文本串时,你必须将它转义两次(一次是为 JavaScript 字符串转义,另一次是为 querySelector 转义):