不直接操作NodeList,将其转换成静态数组后再使用
方法: Array.prototype.slice.call() => 标准浏览器
逐个拷贝到一个新数组中 => For IE
需要注意的是,遍历NodeList时,不做对当前NodeList相关结构有影响的DOM操作,并且如之前所提到的,要缓存一些频繁使用到的属性值,以免发生不必要的悲剧。
1 <span style="font-size: 16px; font-family: 宋体;"> 2 var divs = document.getElementsByTagName('DIV'); 3 //假定页面中有div,所以divs.length是大于0的 4 for (var idx = 0; idx < divs.length; idx++){ 5 document.body.appendChild( 6 //杯具悄然而置 7 document.createElement('DIV') 8 ); 9 console.info(divs.length); 10 } 11 </span>
上面的代码最后运行会报错,原因通过不断地往document.body下插入div 节点,for循环的终止条件( div.length也随之改变)失效,陷入死循环。也就是说通过getElementsByTagName()获取得到的是一个Live NodeList的引用,任何对其相关的DOM操作都会立即反应在这个NodeList上面。