JS中的remove并没有彻底的删除节点!节点依在

fsh2008 2013-04-24 03:22:43
我先叙述一下我所一件的问题 就是这个问题导致了内存溢出

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中有相应的处理

来吧。。讨论讨论
...全文
2702 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ILOVE_ASPNET 2013-05-23
  • 打赏
  • 举报
回复
还个会不会彻底的删除还真没 仔细的测试过,不过楼主说的一些想法 楼主也还是要吧参考的 ,如果你的需求是把 第一个元素放到最后 一个,也有可能是修改过后的,你大可以获取第一个元素 然后针对于你的需求做对应的修改,然后直接 将这个元素直接插入到 用用JQ的insertAfter方法试试 关于insertAfter API里面的解说: 如果一个被选中的元素被插在另外一个地方,它将被移动到目标元素的后面,注意是移动而不是复制 这样的话应该就只是一个元素移动的问题了。
跳蚤图 2013-05-23
  • 打赏
  • 举报
回复
ftiger 2013-05-22
  • 打赏
  • 举报
回复
漏了两句在前面

d= document.createElement("div"),
ie=!+"\v1",
ftiger 2013-05-22
  • 打赏
  • 举报
回复
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);
};

mujieling 2013-05-22
  • 打赏
  • 举报
回复
/*删除父节点*/ function delectParent(node){ var pnode=node.parentNode; pnode.innerHTML=""; //清除节点内的内容 pnode.removeNode(); //删除节点 delete pnode; //从内存中删除节点信息 } 我这样做的可以,不知能不能帮助你
KK3K2005 2013-04-25
  • 打赏
  • 举报
回复
释放管释放的问题 你的业务逻辑 按我说 就直接移动节点 干嘛要复制 删除 移动呢
  • 打赏
  • 举报
回复
引用 3 楼 wzs_xyz 的回复:
var tempElement = $("#panent").find("div:first").detach(true); $("#panent").append(tempElement ); 多看看API文档,这种问题很容易解决
。。。。。。。。。。。。。
oxfed 2013-04-24
  • 打赏
  • 举报
回复
另外,如果你只是想更新内容(例如实现一个滚动列表),你可以从新生成列表;也可以直接把第一个子节点作为最后一个子节点,再更新最后一个节点的内容。 var text="你要显示的信息"; parentNode.firstChild=parentNode.lastChild; parentNode.lastChild.innerHTML=text;
oxfed 2013-04-24
  • 打赏
  • 举报
回复
我刚才看了下书《javascript高级程序设计》,replaceNode(),removeNode(),并不会删除元素,只是元素对象在没在文档树中,所以检测的结果也是对的。 所以, setInterval(move,3000);一直在耗内存
functionsub 2013-04-24
  • 打赏
  • 举报
回复

window.attachEvent('onload',function(){
    document.getElementById('dele').attachEvent('onclick',function(){
        document.getElementById('logoParent').removeChild(document.getElementById('logo'));
    });
})
我都这样做了,还是这样,,弄的我也郁闷了,你确定这个玩意准???
fsh2008 2013-04-24
  • 打赏
  • 举报
回复
我在这个期间又做了下面测试:
页面上有如下div

<div id = "logoParent">
<div id="logo">
</div>


执行如下操作:

$("#logoParent").find("#logo").remove();


sieve检查如下图哈:






引用 3 楼 wzs_xyz 的回复:
var tempElement = $("#panent").find("div:first").detach(true);
$("#panent").append(tempElement );

多看看API文档,这种问题很容易解决


马上看看你说的这个
functionsub 2013-04-24
  • 打赏
  • 举报
回复
将新数据放进去也是可以不重新生成一个再放。 建议你把其他代码删掉,只留这一段代码以及相关的HTML\CSS,再看看会不会出现泄漏的情况,很多时候不是你认为没有就是没有的。泄漏这个东西还是比较蛋疼的。要么多贴一点代码?
未知数 2013-04-24
  • 打赏
  • 举报
回复
var tempElement = $("#panent").find("div:first").detach(true); $("#panent").append(tempElement ); 多看看API文档,这种问题很容易解决
fsh2008 2013-04-24
  • 打赏
  • 举报
回复
引用 1 楼 functionsub 的回复:
1.没有必要先复制一个再删除原来的,再吧复制出来的放到最后一个,直接把第一个放到最后一个就可以了 。 2.代码没看出什么问题,我是不太清楚你是不是给给这些div做过添加属性的操作,像下面这样: JavaScript code?1234var div = $("#panent").find('div');for(var i=0,len=div.length;i<……
1.这里的目的是删除第一个,进行clone,再放到末尾。。。主要是为了接收新数据,将新的数据放入这个div中去 从而达到一个定时刷新的功能。 2.这里主要的问题是这样:用sieve的工具进行检测,Orphan这个属性居然有很多是YES,然而这些yes所标记的div, 都是曾经执行过remove了的div, 而对于orphan为yes的节点,在上面已经提到了他们是什么。。 这里并没有对DIV执行类似你所言的操作
functionsub 2013-04-24
  • 打赏
  • 举报
回复
1.没有必要先复制一个再删除原来的,再吧复制出来的放到最后一个,直接把第一个放到最后一个就可以了 。 2.代码没看出什么问题,我是不太清楚你是不是给给这些div做过添加属性的操作,像下面这样:

var div = $("#panent").find('div');
for(var i=0,len=div.length;i<len;i++){
   div[i].someAttr = 'attrvalue'+i;
}
如果做过这样的操作,在IE下溢出是必然的。

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧