日期:2014-05-16  浏览次数:20473 次

一道百思不解的难题
JScript code
<script>
        var movepic={
            topmove:function(){
                var list=document.getElementById("md").getElementsByTagName("img");
                var ele='';
                for(var n=0;n<list.length;n++)
                {
                    ele=list[n].cloneNode(true);
                }
                document.getElementById("md").appendChild(ele);
            }
        }
        movepic.topmove();
    </script>


document.getElementById("md").appendChild(ele);写在for循环里,浏览器崩溃了,,写在外面可以但只有1个,,怎么处理的

------解决方案--------------------
写在for循环里就变成死循环了吧
------解决方案--------------------
这个函数会在页面加载完之前调用,根本获取不到html元素,自己alert一下就知道了

------解决方案--------------------
for(var n=0, nLen = list.length ;n< nLen;n++)
{
ele=list[n].cloneNode(true);
}

------解决方案--------------------
list.length在每次循环的时候都会判断list的长度,如果把append放到for里面,而你每次循环的都是都clone了一个node添加到里面,这个就造成死循环了。放到 for外面的话,ele是一个空字符串,应该会报dom错误之类的异常。
------解决方案--------------------
cloneNode 是怎么样的,你这段代码又是想实现什么功能呢?
------解决方案--------------------

假如写在里面
var list=document.getElementById("md").getElementsByTagName("img");
for(var n=0;n<list.length;n++)
{
ele=list[n].cloneNode(true);
document.getElementById("md").appendChild(ele);
}
你不觉得list的长度是一直变大的

------解决方案--------------------
+1
探讨
假如写在里面
var list=document.getElementById("md").getElementsByTagName("img");
for(var n=0;n<list.length;n++)
{
ele=list[n].cloneNode(true);
document.getElementById("md").appendChild(ele);
……

------解决方案--------------------
探讨
照理这个var list=document.getElementById("md").getElementsByTagName("img");这个值已经定型了哇,,就算运行for循环,怎么还会动,,说法貌似不大合理

------解决方案--------------------
var list=document.getElementById("md").getElementsByTagName("img");
getElementsByTagName返回的只是一个 查询的映射(看起来是一个集合)
该映射 会根据页面dom的更改 动态变化
当你在枚举该集合的时候 修改这个集合的关联的查询位置的dom
则这个集合无限变大

解决方案是
先把 该集合中复制的元素 复制到一个 dom碎片中 最后才添加进 需要的dom中