Является ли jQuery replaceWith() также удалять обработчики событий?

Я просмотрел документацию jQuery для ответа на этот простой вопрос:

Вызывает ли replaceWith() вызов remove() или detach() под капотом?

Мне не повезло с официальной документацией; он неоднозначно определяется как удаление node. Но тесты показывают утечку памяти.

Ответ 1

Глядя на исходный код jQuery (2.1.1), вы задаете два разных вопроса.

  • Удаляет ли jQuery replaceWith() обработчики событий?

    Да. jQuery вызывает cleanData(), который является внутренним методом, который удаляет все данные элемента. Поскольку обработчики событий jQuery хранятся в данных элементов, они также будут очищены.

    cleanData() также удаляет обработчик событий, прикрепленный к элементу, который запускает выполнение всех обработчиков событий, хранящихся в данных элементов, вызывая jQuery.removeEvent() (другой внутренний метод).

  • Вызывает ли replaceWith() вызов remove() или detach() под капотом?

    Единственный раз, когда он вызывает remove(), - если аргументы replaceWith() не были предоставлены; jQuery рассматривает его так, как если бы вы вызывали remove() вместо replaceWith();


TL; DR: jQuery очистит все для вас, поэтому не должно быть риска утечек памяти.

Ответ 2

FYW, если вы не хотите, чтобы это поведение рассматривало эту слабо обсуждаемую тему через jQuery-билеты http://bugs.jquery.com/ticket/13400

а для тех, кто не хочет ожидать кода, здесь реализована реализация replaceWith, которая использует detach вместо remove

с удалением()

old.replaceWith( new );

с отсоединением()

old.before( new ).detach();