我真的很努力了,但是还是被IE摆了一道(关于removeChild)

首先声明, 这事我也有责任!!!!
对IE的内存泄露 和IE的内存回收 以及IE7的不思进取了解的不够!!!

我印象中 下面三件事能够引起IE臭名昭著的内存问题

[color=blue]1 dom和js对象彼此之间不恰当的引用
以及
2 给dom结点添加事件
还有
3 反复的对dom进行innerHTML操作[/color]

以上三点都有可能引起内存泄露或者是内存无法回收.

所以我在开发时极力避免了上面情况的发生.而且我是在IE7下进行开发和测试.

当我避免了上面的三种错误, 而且在IE7下测试,依然产生大量的孤立dom结点时
我就不得不怀疑我的程序存在严重问题了. 于是我开始看啊 找啊 分析啊 调试啊

GT grid的几千行代码不停的改着测着 但是我就是没找到原因 而且代码被我弄得面目全非,依然没有找到原因.

周日发布最新demo版的计划也要暂时搁浅了


不过 我真的很努力了 希望大家相信我 也继续支持我


先不给自己的再次食言找接口了 继续我的那个问题. 后来自己写了一个简单的页面. 一个避免了上面提到的三点 而且足够简单的页面



<html>
<head>
<script type="text/javascript">

function $(id) {
return typeof(id)=='string'?document.getElementById(id):id;
}

function removeElement(el){
el=$(el);
if (el && el.parentNode) {
el.parentNode.removeChild(el);
}
}

</script>
</head>

<body >
<div id="ttt">aaa</div>

<input type="button" value="b1" onclick="removeElement('ttt')">
</body>
</html>


原来ie的 removeChild 也有问题 . 其实EXT已经提供了一个相对好的解决方案

大家看看ext的做法:



removeNode : isIE ? function(){
var d;
return function(n){
if(n && n.tagName != 'BODY'){
d = d || document.createElement('div');
d.appendChild(n);
d.innerHTML = '';
}
}
}() : function(n){
if(n && n.parentNode && n.tagName != 'BODY'){
n.parentNode.removeChild(n);
}
},


唉 都怪我学习他人代码的时候不够认真仔细 看来还要继续努力了.
不过 ext这种做法真的就是最好的吗?? 还有没有更好的呢??


====================================
[color=red]经过hax的提示 又做了测试 果然有更好的办法[/color]

那就是在 利用ie下的 outerHTML="" 方法.

另外关于 ie 的 removeNode方法测试了

当使用 el.removeNode() 时 可以清除el 同时内存会回收
但是 大家注意 这时候由于没有指定 删除子结点 (removeNode的参数)
所以子结点不会被删除
于是我加上了参数 el,removeNode(true)

奇怪的事情发生了 此时不好用了 el和el的子结点都没有被回收

这样看来 removeNode 就没什么意义了

====================================
[color=red]但是 经过进一部确认 最好的做法还是 ext的做法[/color]

因为不是所有的元素都可以执行 outerHTML="" 这个操作的
因为和innerHTML一样 对于有些元素来说 outerHTML这个属性是只读的

呵呵

这么一个小问题 我也要研究这么半天 唉 看来基础知识还需要加强啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值