Несколько событий и утечка памяти - PullRequest
2 голосов
/ 25 декабря 2010

Я создаю несколько элементов с прикрепленными событиями и удаляю их с помощью "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 Ответ

2 голосов
/ 25 декабря 2010

Нет - для безопасности установите атрибуты "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 ?")
        }
    }

Сборщик мусора узла DOM в Internet Explorer не знает, что делать с JavaScriptмусор, так что он потерян.(Вполне возможно, что DOM-узлы, висящие на свободных объектах JavaScript, аналогичным образом игнорируются; я не могу точно вспомнить.)

Каждый из этих обработчиков событий будет иметь ссылку на замыкания, сформированные внешнимобработчик onload и обработчик onclick элемента управления insert.Они все будут делиться ссылкой, так что в этом конкретном случае я не думаю , что это было бы так много памяти.Однако, если вы настроите каждый из этих 1000 обработчиков событий с помощью другой функции , тогда будет гораздо больше утечек.

Я не хочу это говорить, но одно из удобствиспользование фреймворка заключается в том, что многие ( не все , но многие) такого рода вещи позаботятся о вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...