首先声明, 这事我也有责任!!!!
对IE的内存泄露 和IE的内存回收 以及IE7的不思进取了解的不够!!!
我印象中 下面三件事能够引起IE臭名昭著的内存问题
1 dom和js对象彼此之间不恰当的引用
以及
2 给dom结点添加事件
还有
3 反复的对dom进行innerHTML操作
以上三点都有可能引起内存泄露或者是内存无法回收.
所以我在开发时极力避免了上面情况的发生.而且我是在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这种做法真的就是最好的吗?? 还有没有更好的呢??
====================================
经过hax的提示 又做了测试 果然有更好的办法
那就是在 利用ie下的 outerHTML="" 方法.
另外关于 ie 的 removeNode方法测试了
当使用 el.removeNode() 时 可以清除el 同时内存会回收
但是 大家注意 这时候由于没有指定 删除子结点 (removeNode的参数)
所以子结点不会被删除
于是我加上了参数 el,removeNode(true)
奇怪的事情发生了 此时不好用了 el和el的子结点都没有被回收
这样看来 removeNode 就没什么意义了
====================================
但是 经过进一部确认 最好的做法还是 ext的做法
因为不是所有的元素都可以执行 outerHTML="" 这个操作的
因为和innerHTML一样 对于有些元素来说 outerHTML这个属性是只读的
呵呵
这么一个小问题 我也要研究这么半天 唉 看来基础知识还需要加强啊