节点集合 by 司徒正美 司徒正美
司徒正美
司徒正美
司徒正美
司徒正美
[ctrl+a 全选 注:如需引入外部js需刷新才能执行]
如果预先将nodelist转换为数组就没有问题!
复制代码 代码如下:
window.onload = function(){
var d = document.createdocumentfragment();
var div = document.getelementbyid(aaa);
var c = div.childnodes;
var arr = [];
for(var i=0,n=c.length;iarr.push(c[i])
}
for(var i=0,n=arr.length;ialert(arr[i] + + i)
d.appendchild(arr[i])
}
div.parentnode.replacechild(d,div)
}
节点集合 by 司徒正美 司徒正美
司徒正美
司徒正美
司徒正美
司徒正美
[ctrl+a 全选 注:如需引入外部js需刷新才能执行]
很显然nodelist还一些奇怪的特性是数组没有的。从运行框2中,我们可以看到把节点appendchild到文档碎片时,其实会把它从dom树中剥离出来,nodelist一定是跟踪这变化,动态改变了它自身,而直线递加的i是无法对应正确的节点的索引!因此我们每次取得它的firstchild就行了。
复制代码 代码如下:
window.onload = function(){
var d = document.createdocumentfragment();
var div = document.getelementbyid(aaa);
var c = div.childnodes;
while(c.length) d.appendchild(c[0])//每次只取它第一个节点,直到取空
div.parentnode.replacechild(d,div)
}
变态的childnodes by 司徒正美 司徒正美
司徒正美
司徒正美
司徒正美
司徒正美
[ctrl+a 全选 注:如需引入外部js需刷新才能执行]
顺便一提,由getelementsbytagname取得的htmlcollection也是这个样子,因此处理这类节点集合要打起十二分精神了!
htmlcollection by 司徒正美 司徒正美
司徒正美
司徒正美
司徒正美
司徒正美
[ctrl+a 全选 注:如需引入外部js需刷新才能执行]
这两种节点集合在各浏览器还实现得不太一样,如标准浏览器我们可以用array.prototype.slice.call将它们转换为原生数组,ie则报错。标准浏览器的它们有hasownproperty与valueof,而ie是没有的……