我先叙述一下我所一件的问题 就是这个问题导致了内存溢出1.首先假设有一个parent的节点,该节点中有很个子节点
我们要完成以下功能,删除第一个  移动到最后一个去. function move(){
    var firstElement_height=$("#panent").find("div:first").height();
    $("#panent").animate({marginTop: -firstElement_height-11+"px"},1000,function(){
        var tempElement = $("#panent").find("div:first").clone(true);
        $("#panent").find("div:first").remove();
        $("#panent").append(tempElement );  
    }
}setInterval(move,3000);
就这样  多跑跑  改改速度,IE中挂了,然后下载了一个sieve的工具进行检测,Orphan这个属性居然有很多是YES  
文档中说明了这个属性的用处:
6、Orphan:如果这一列的值为“YES”,则表明这个元素不附属于document.body中(即页面的BODY中)。在IE中,这种元素会导致内存泄露,应给予高度的关注相当于现在不是删除了再增加节点,而是每次增加一个节点,久了就挂了
我想问题应该出在这里了,苦逼弄了几个小时想解决办法  没有进展,于是发出来大家看看  帮忙支支招。  如何才能彻底的删除,让对象彻底的释放。没用过sieve的可以百度百度
这个是下载链接
http://download.csdn.net/download/gufengpiaoxue/4941674
帮助文档:
http://wenku.baidu.com/view/153beb80ec3a87c24028c439.html
FF我测试过,没问题,应该在FF中有相应的处理来吧。。讨论讨论JavaScriptInternet ExplorerJquery内存溢出内存泄露

解决方案 »

  1.   

    1.没有必要先复制一个再删除原来的,再吧复制出来的放到最后一个,直接把第一个放到最后一个就可以了 。2.代码没看出什么问题,我是不太清楚你是不是给给这些div做过添加属性的操作,像下面这样:
    var div = $("#panent").find('div');
    for(var i=0,len=div.length;i<len;i++){
       div[i].someAttr = 'attrvalue'+i;
    }
    如果做过这样的操作,在IE下溢出是必然的。
      

  2.   


    1.这里的目的是删除第一个,进行clone,再放到末尾主要是为了接收新数据,将新的数据放入这个div中去  从而达到一个定时刷新的功能。
    2.这里主要的问题是这样:用sieve的工具进行检测,Orphan这个属性居然有很多是YES,然而这些yes所标记的div,  都是曾经执行过remove了的div,  而对于orphan为yes的节点,在上面已经提到了他们是什么。。  
    这里并没有对DIV执行类似你所言的操作
      

  3.   

            var tempElement = $("#panent").find("div:first").detach(true);
            $("#panent").append(tempElement );  多看看API文档,这种问题很容易解决
      

  4.   

    将新数据放进去也是可以不重新生成一个再放。建议你把其他代码删掉,只留这一段代码以及相关的HTML\CSS,再看看会不会出现泄漏的情况,很多时候不是你认为没有就是没有的。泄漏这个东西还是比较蛋疼的。要么多贴一点代码?
      

  5.   

    我在这个期间又做了下面测试:
    页面上有如下div<div id = "logoParent">
        <div id="logo">
    </div>
    执行如下操作:$("#logoParent").find("#logo").remove();
    sieve检查如下图哈:马上看看你说的这个
      

  6.   


    window.attachEvent('onload',function(){
        document.getElementById('dele').attachEvent('onclick',function(){
            document.getElementById('logoParent').removeChild(document.getElementById('logo'));
        });
    })我都这样做了,还是这样,,弄的我也郁闷了,你确定这个玩意准???
      

  7.   

    我刚才看了下书《javascript高级程序设计》,replaceNode(),removeNode(),并不会删除元素,只是元素对象在没在文档树中,所以检测的结果也是对的。所以,
    setInterval(move,3000);一直在耗内存
      

  8.   

    另外,如果你只是想更新内容(例如实现一个滚动列表),你可以从新生成列表;也可以直接把第一个子节点作为最后一个子节点,再更新最后一个节点的内容。
    var text="你要显示的信息";
    parentNode.firstChild=parentNode.lastChild;
    parentNode.lastChild.innerHTML=text;
      

  9.   

    /*删除父节点*/
    function delectParent(node){
    var pnode=node.parentNode;
    pnode.innerHTML=""; //清除节点内的内容
    pnode.removeNode(); //删除节点
    delete pnode; //从内存中删除节点信息

    }
    我这样做的可以,不知能不能帮助你
      

  10.   

    ie的对象清理和删除,在sIeve测试过还行。
    clean= function (dom) {
    var sons= dom.childNodes,uid=dom.$UID;
    if(sons && sons.length==0) {
    var i= sons.length ;
    while(i--){
    if(sons[i].nodeType ==1)
    clean(sons[i]);
    };
    }
         //这个是自己实现的cache,jQuery有他自己的,
    if(uid != null){
    delete _eleDatas[uid];
    delete _collected[uid];
    }
    if (dom.removeEvents) dom.removeEvents();  //ie也知道它有bug,但只放出这个,它自动的不会,还要我们帮忙
    if (dom.clearAttributes) dom.clearAttributes(); //同上
    sons=i=uid=null;
    return dom;
    },delDom= ie?function (dom) { //ie的removeChild有bug,要这样才能彻底删除
    clean(dom); 
    d.appendChild(dom);
    d.innerHTML="";;
    }:function (dom) {
    clean(dom);
    if(dom.parentNode) dom.parentNode.removeChild(dom);
    };
      

  11.   

    漏了两句在前面d= document.createElement("div"),
    ie=!+"\v1",
      

  12.   

    还个会不会彻底的删除还真没 仔细的测试过,不过楼主说的一些想法 楼主也还是要吧参考的
    ,如果你的需求是把 第一个元素放到最后 一个,也有可能是修改过后的,你大可以获取第一个元素 然后针对于你的需求做对应的修改,然后直接 将这个元素直接插入到 用用JQ的insertAfter方法试试 关于insertAfter API里面的解说:
    如果一个被选中的元素被插在另外一个地方,它将被移动到目标元素的后面,注意是移动而不是复制这样的话应该就只是一个元素移动的问题了。