我使用附加事件创建了几个元素,并使用“innerHTML =''”删除它们。元素已经出来了,但事件呢?它们也被删除了吗?
<script type = "text/javascript">
window.onload = function () {
var container = document.createElement ("div");
container.style.marginTop = "20px";
var erase = document.createElement ("input");
erase.setAttribute ("type", "button");
erase.value = "Erase inputs";
var insert = document.createElement ("input");
insert.setAttribute ("type", "button");
insert.value = "Insert inputs";
document.body.appendChild (insert);
document.body.appendChild (erase);
document.body.appendChild (container);
erase.onclick = function () {
if (container.innerHTML !== "") {
container.innerHTML = "";
alert ("innerHTML = \"\". What about the events ?")
}
}
insert.onclick = function () {
for (var i = 0; i < 1000; i ++) {
var input = document.createElement ("input");
input.setAttribute ("type", "button");
input.value = "Click Me !";
input.onclick = function () {
alert ("STOP ! Hammer time :)")
}
container.appendChild (input);
}
}
}
</script>
可能的内存泄漏?
感谢。
答案 0 :(得分:2)
不 - 为了安全起见,请在清除内容之前将“onclick”属性设置为null。
erase.onclick = function () {
if (container.innerHTML !== "") {
var inps = container.getElementsByTagName('input');
for (var inpi = 0; inpi < inps.length; ++inpi)
inps[i].onclick = null; // also "onchange", "onblur", anything else
container.innerHTML = "";
alert ("innerHTML = \"\". What about the events ?")
}
}
Internet Explorer中的DOM节点垃圾收集器不知道如何处理JavaScript垃圾,因此它丢失了。 (可能情况是,悬挂在免费JavaScript对象上的DOM节点同样被忽略;我不记得确切。)
这些事件处理程序中的每一个都将引用由外部“onload”处理程序和“insert”控件的“onclick”处理程序形成的闭包。他们都将共享一个引用,所以在这种特殊情况下,我不会认为它就是那么多内存。但是,如果你通过另一个函数设置了这1000个事件处理程序中的每一个,那么就会有更多的泄漏。
我讨厌这样说,但使用框架的一个便利是,很多(不是全部但很多)这类事情都会为你照顾。