2013-05-07 2 views
0

Я пишу jQuery JS-файл, который прикрепляет обработчик события к ссылке, но обработчик события заменяет ссылку новой ссылкой, полученной с помощью запроса ajax. Это на самом деле функция +1, -1, поэтому ссылка переключается взад и вперед.Должен ли я отсоединить обработчик событий до того, как я снова привяжу его к новому элементу?

Насколько я понимаю, даже если ссылка дважды нажата и возвращается к первоначальному значению, она станет третьим уникальным объектом, правильно? Мой вопрос в том, делает ли мне все возможное, чтобы каждый раз отсоединять обработчик событий? Поскольку он не выдает ошибку, когда я удаляю обработчик события после замены ссылки, я задаю , угадывая, что объект и его обработчик событий все еще существуют в JS, они больше не находятся в документе HTML, правильно? Он отлично работает, независимо от того, делаю я это или нет, но сейчас я на 100% уверен, как именно работает этот процесс.

Вот моя функция .done():

.done(function(ReturnData){ 
    PlusOneDiv.replaceWith(ReturnData); 
    // Redefine variables and detatch/reattach event 
    PlusOneLink.off('click'); // Is this line helpful at all? 
    PlusOneDiv = $('#plusonediv'); 
    PlusOneLink = PlusOneDiv.children('a'); 
    PlusOneLink.on('click', submit_plus_one); 
+0

afaik jQuery делает это автоматически для вас за кулисами. –

+0

@Jack Во время игры с методами манипуляции DOM jQuery один или два года назад стало совершенно очевидно, что jQuery делает это за кулисами для вас. Хотя я думаю, что после некоторых дополнительных тестов я узнал, что на самом деле это уже используют собственные методы 'appendChild' и' insertBefore' класса 'HTMLElement'. По крайней мере, насколько я помню ... – Kiruse

+0

@ Derija93 Это интересно! У вас есть ссылка на это? –

ответ

1

При замене элемента, он удаляется из DOM. Если элемент не ссылается ни на что другое, тогда он будет иметь право на сбор мусора, и когда он будет собран мусором, его обработчик кликов также будет собирать мусор (если предположить, что ничего не ссылается на обработчик кликов).

Но если есть, например, глобальная переменная где-то в вашем коде, как это:

var plusOneDiv = $("#plusonediv"); 

и не обновлять эту переменную для обозначения новой линии, который извлекается с помощью AJAX, то даже хотя замена элемента с помощью $(...).replace(...) удаляет его из DOM, он не будет собирать мусор. Но похоже, что вы его обновляете, поэтому исходный элемент #plusonediv и его слушатель в конечном итоге собирают мусор и удаляются из памяти.

+0

Yup, он обновляется. Благодаря! – Adam11

Смежные вопросы