几个事件和内存泄漏

时间:2010-12-25 14:37:38

标签: javascript memory memory-leaks

我使用附加事件创建了几个元素,并使用“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>

可能的内存泄漏?

感谢。

1 个答案:

答案 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个事件处理程序中的每一个,那么就会有更多的泄漏。

我讨厌这样说,但使用框架的一个便利是,很多(不是全部但很多)这类事情都会为你照顾。