2009-02-17 5 views
20

Что происходит в jQuery, когда вы удаляете() элемент и добавляете() его в другое место?Являются ли события потерянными в jQuery, когда вы удаляете() элемент и добавляете() его в другое место?

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

Если это так - есть ли какие-либо простые способы переосмыслить события только в той части HTML или по-другому переместить элемент, не потеряв при этом событие в первую очередь.

ответ

28

Да, подход jQuery с remove() - это отвязать все, связанное с собственными jQuery bind (для предотвращения утечек памяти).

Однако, если вы просто хотите что-то переместить в DOM, вам не обязательно это remove(). Всего append к содержанию вашего сердца, привязок событий будет палки вокруг :)

Например, вставьте в ваш поджигатель на этой странице:

$('li.wmd-button:eq(2)').click(function(){ alert('still here!') }).appendTo(document.body) 

А теперь прокрутите вниз до нижней части этой страницы и нажмите на значок маленького глобуса, который теперь похоронен под нижним колонтитулом SO. Вы получите alert. Все, потому что я позаботился о том, чтобы не remove это первое.

+0

прохладный. Я надеялся, что это так. yay для интерактивного stackoverflow! –

0

использование jQuery1.3.1 жить(), чтобы связать события и вам не нужно будет беспокоиться об этом ..

Update: живые события являются устаревшими в настоящее время, но вы можете получить тот же эффект от $ (документ) .на().

+0

да так, чтобы мой первоначальный вопрос? что именно происходит. я буду проверять «живьем» сейчас –

+0

определенно хорошо знать о жизни - но должен быть осторожен в предостережениях здесь http://docs.jquery.com/Events/live#typefn –

+1

не применимо, если вы работаете с специфические dom-объекты, а не селекторы. это была моя первая идея. –

51

JQuery открепления() функции является таким же, как Удалить() но сохраняет обработчик событий в объекте, который она возвращает. Если вам нужно удалить элемент и поместить его в другое место, вы можете просто использовать его.

var objectWithEvents = $('#old').detach(); 
$('#new').append(objectWithEvents); 

Проверьте API Docs здесь: http://api.jquery.com/detach/

+0

Мне нужно было отсортировать группу элементов, чтобы удалить их из своих родительских объектов с помощью $ parent.empty(), а затем добавить отсортированный список элементов обратно на родителя. Это был правильный ответ для меня. Благодаря! – Bart

+0

спасибо !!! работа для меня. – jruzafa