理解NodeList及其“近亲”NamedNodeMap和HTMLCollection,是从整体上透彻理解DOM的关键。
jUN易塔云建站-模板下载,web开发资源,技术博客这三个集合都是“动态的”;换句话说,每当文档结构发生变化时,它们都会得到更新。
jUN易塔云建站-模板下载,web开发资源,技术博客因此,它们都会保存着最新、最准确的信息。从本质上说,所有NodeList对象都是在访问DOM文档时实时运行的查询。
jUN易塔云建站-模板下载,web开发资源,技术博客例如,下面的例子会导致无限循环:
var divs = document.getElementsByTagName("div"), i, div;jUN易塔云建站-模板下载,web开发资源,技术博客
for(i=0; i<divs.length; i++){jUN易塔云建站-模板下载,web开发资源,技术博客
div = document.createElement("div");jUN易塔云建站-模板下载,web开发资源,技术博客
document.body.appendChild(div);jUN易塔云建站-模板下载,web开发资源,技术博客
}
第一行代码会取得文档中所有<div>元素的HTMLCollection。
jUN易塔云建站-模板下载,web开发资源,技术博客由于这个集合是“动态的”,因此只要有新<div>元素被添加到页面中,这个元素也会被添加到集合中。
jUN易塔云建站-模板下载,web开发资源,技术博客浏览器不会讲创建的所有集合都保存在一个列表中,而是在下一次访问集合的时候再更新集合。
jUN易塔云建站-模板下载,web开发资源,技术博客结果,在遇到上栗中所示的循环代码时,就会导致一个有趣的问题。
jUN易塔云建站-模板下载,web开发资源,技术博客每次循环都要对条件:i<divs.length求值,意味着会运行取得所有<div>元素的查询。
jUN易塔云建站-模板下载,web开发资源,技术博客考虑到循环体每次都会创建一个新<div>元素并将其添加到文档中,因此divs.length的值在每次循环后都会递增。
jUN易塔云建站-模板下载,web开发资源,技术博客既然i和div.length每次都会同时递增,结果的值永远不会相等。
jUN易塔云建站-模板下载,web开发资源,技术博客如果想要迭代一个NodeList,最好是使用length属性初始化第二个变量,然后将迭代器与该变量进行比较,如下所示:
var div = document.getElementById("div"), i, len, div;jUN易塔云建站-模板下载,web开发资源,技术博客
for(i=0, len=divs.length; i<len; i++){jUN易塔云建站-模板下载,web开发资源,技术博客
div = document.createElement("div");jUN易塔云建站-模板下载,web开发资源,技术博客
document.body.appendChild(div)jUN易塔云建站-模板下载,web开发资源,技术博客
}
这个例子中,初始化了第二个变量len。由于len中保存着对divs.length在循环开始时的一个快照,因此就会避免上一个例子中出现的无限循环问题。
jUN易塔云建站-模板下载,web开发资源,技术博客一般来说,应尽量减少访问NodeList的次数。因为每次访问NodeList,都会进行一次基于文档的查询。
jUN易塔云建站-模板下载,web开发资源,技术博客所以,可以考虑将从NodeList中取得的值缓存起来。