В jQuery, если вы удалите элемент, будут ли удалены какие-либо события на нем?

StackOverflow https://stackoverflow.com/questions/1538243

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

Ответ — да, если событие было прикреплено С помощью 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 как объект jQuery.

RecursiveUnbind($('#container'));

Для справки: вам не нужно беспокоиться об утечках памяти в JavaScript.(расслабьтесь, чувак, а не C++!)

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

Несвязано:Мне нравится, что в JavaScript все является объектом :D

Ваше здоровье!
джрх

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top