Правильный способ предотвращения утечек памяти на слушателе событий DOM - PullRequest
6 голосов
/ 31 августа 2010

Несколько глупых вопросов о DOM, пожалуйста, не ненавидите меня

По некоторым причинам мне нужно передать анонимную функцию в addEventListener (в основном, для «передачи» переменных контекста), но однажды вызванный слушатель может быть удаленпоэтому я хочу понять, является ли код, показанный ниже, правильным способом отсоединения слушателя.

    var item = document.createElement("div");
    item.addEventListener("click", function(event) {
        // do some stuff
        // remove listener otherwise we generate a memory leak
        item.removeEventListener("click", arguments.callee, false);
    }, false);

    var menu = document.getElementById("mymenu"); // some element
    menu.appendChild(item);

Другой вопрос, если меню элемента удаляется из его родителя с помощью removeChild, слушатель удаляется автоматически?

1 Ответ

6 голосов
/ 31 августа 2010

Я знаю, что вы хотите использовать анонимную функцию, но вам лучше использовать именованную функцию; он все еще должен иметь доступ к тем же внешним переменным.

Возможно, это:

var item = document.createElement("div");
var listener = function(event) {
        // do some stuff
        // remove listener otherwise we generate a memory leak
        item.removeEventListener("click", listener, false);
    };
item.addEventListener("click", listener, false);

var menu = document.getElementById("mymenu"); // some element
menu.appendChild(item);

О, и я вас не ненавижу :) 1006 *

...