В jQuery, если вы удалите элемент, будут ли удалены какие-либо события на нем? - PullRequest
4 голосов
/ 08 октября 2009

Например, если у меня есть ссылка со следующим событием:

$("a.d").bind("click", this, onDelete);

А позже сделайте:

$("a.d").remove();

Это нормально?Или это вызывает утечку памяти, и мне нужно позвонить 1-й раз?

Спасибо за любую помощь.

Ответы [ 4 ]

6 голосов
/ 08 октября 2009

Из документации по jQuery для удаления ()

Удаляет все совпадающие элементы из DOM. Это НЕ удаляет их из объект jQuery, позволяющий использовать согласованные элементы дальше. Заметка что эта функция начиная с 1.2.2 также удалит все обработчики событий и внутренне кэшированные данные.

4 голосов
/ 08 октября 2009

Я не проверял это, но я верю, что удаление элемента приведет к отмене привязки его обработчиков событий. Я пришел к такому выводу из документации jQuery API (поиск удаления), в которой говорится, что если вы хотите переместить элемент из одной части DOM в другую, то:

$("#foo").remove().appendTo("#bar");

должно быть записано как

$("#foo").appendTo("#bar");

, чтобы не потерять обработчики событий.

0 голосов
/ 25 октября 2012

Ответ - да, если событие было присоединено с помощью jQuery. Если я прикрепил что-то вроде «onclick», я не верю, что так будет.

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

http://www.computerhowtoguy.com/how-to-use-the-jquery-unbind-method-on-all-child-elements/

function RecursiveUnbind($jElement) {
    // remove this element's and all of its children's click events
    $jElement.unbind();
    $jElement.removeAttr('onclick');
    $jElement.children().each(function () {
        RecursiveUnbind($(this));
    });
}

Чтобы использовать функцию в предыдущем примере, мы бы назвали функцию, передав ей div «container» в качестве объекта jQuery.

RecursiveUnbind($('#container'));
0 голосов
/ 08 октября 2009

Для записи вам не нужно беспокоиться об утечках памяти в javascript. (холодный человек, а не с ++!)

Движок javascript браузера управляет всеми объектами, а мусор собирает их. Когда я говорю объекты, это также означает функции обработки событий, потому что функции также являются объектами в javascript.

Не имеет отношения: я люблю, как все является объектом в JavaScript: D

Ура!
JRH

...