getElementsByTagName()
方法返回对应标签名的元素的一个动态集合, 只要document发生变化,就会自动更新对应的元素。 因此, 下面的代码实际上是一个死循环:
// XXX 实际中请注意...
// 适当的中间变量是一个好习惯
var divs = document.getElementsByTagName("div");
var i=0;
while(i < divs.length){
document.body.appendChild(document.createElement("div"));
i++;
}
querySelectorAll()
方法的不同是它返回一个静态的 NodeList
. 这是表示的 选择器API规范 :
querySelectorAll()
方法返回的 NodeList
对象必须是静态的, 而不能是动态的([DOM-LEVEL-3-CORE], section 1.1.1). 后续对底层document的更改不能影响到返回的这个 NodeList
对象. 这意味着返回的对象将包含在创建列表那一刻匹配的所有元素节点。
所以即便是让 querySelectorAll()
和 getElementsByTagName()
具有相同的参数和行为, 他们也是有很大的不同点。 在前一种情况下, 返回的 NodeList
就是方法被调用时刻的文档状态的快照, 而后者总是会随时根据document的状态而更新。 下面的代码就不会是死循环:
var divs = document.querySelectorAll("div"),
i=0;
while(i < divs.length){
document.body.appendChild(document.createElement("div"));
i++;
}
摘自:https://github.com/cncounter/translation/blob/master/tiemao_2014/NodeList/NodeList.md