Являются ли события потерянными в jQuery, когда вы удаляете() элемент и добавляете() его в другое место?
Что происходит в jQuery, когда вы удаляете() элемент и добавляете() его в другое место?
Похоже, что события отцеплены - как будто вы просто вставляете свежий html (что, я думаю, это то, что происходит). Но его также возможно, что в моем коде есть ошибка, поэтому я просто хотел проверить это поведение, прежде чем продолжить.
Если это так - есть ли какие-либо простые способы переосмыслить события только в той части HTML или другой способ перемещения элемента без потери события в первую очередь.
Ответы
Ответ 1
Да, подход jQuery с remove()
- это отвязать все связанные с jQuery собственные bind
(чтобы предотвратить утечку памяти).
Однако, если вы просто хотите что-то переместить в DOM, вам сначала не нужно remove()
его. Просто append
к вашему сердечному содержимому, привязки событий будут придерживаться:)
Например, вставьте это в свой firebug на этой странице:
$('li.wmd-button:eq(2)').click(function(){ alert('still here!') }).appendTo(document.body)
И теперь прокрутите страницу вниз до нижней части этой страницы и щелкните значок маленького глобуса, который теперь похоронен под нижним колонтитулом SO. Вы получите alert
. Все, потому что я сначала позаботился remove
.
Ответ 2
Функция detach() jQuery совпадает с функцией remove(), но сохраняет обработчики событий в возвращаемом объекте. Если вам нужно удалить элемент и поместить его где-то еще со всем, что вы можете просто использовать.
var objectWithEvents = $('#old').detach();
$('#new').append(objectWithEvents);
Проверьте документы API здесь: http://api.jquery.com/detach/
Ответ 3
используйте jQuery1.3.1 live() для привязки событий, и вам не нужно беспокоиться об этом.
Обновление. Текущие события теперь устарели, но вы можете получить тот же эффект от $(document).on().