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

评论

  • 匿名