Я пытаюсь выяснить, как выполнить код JS, когда элемент удаляется со страницы:
jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */
есть ли для этого событие, что-то вроде:
jQuery('#some-element').onremoval( function() {
// do post-mortem stuff here
});
Спасибо.
Ответы:
Только что проверил, он уже встроен в текущую версию JQuery:
JQuery - v1.9.1
Пользовательский интерфейс jQuery - v1.10.2
Важное замечание : Это функциональность сценария Jquery UI (не JQuery), поэтому для его работы необходимо загрузить оба сценария (jquery и jquery-ui). Вот пример: http://jsfiddle.net/72RTz/
источник
remove
на элементе, он срабатывает, но если элемент уничтожается другим способом, то есть, если он перезаписан, скажем, он не работает.Вы можете использовать специальные события jQuery .
Во всей простоте,
Настроить:
Использование:
Приложение к комментариям Пьера и DesignerGuy:
Чтобы не вызывать обратный вызов при вызове
$('.thing').off('destroyed')
, измените условие if на:if (o.handler && o.type !== 'destroyed') { ... }
источник
o.handler()
наo.handler.apply(this,arguments)
иначе, поскольку объекты события и данные не будут переданы через прослушиватель событий.$('.thing').unbind('destroyed')
действительно раздражаете (поскольку отмена привязки означает, что мы не хотим, чтобы вызывался обработчик ...)Вы можете привязаться к событию DOMNodeRemoved (часть спецификации DOM уровня 3 WC3).
Работает в IE9, последних версиях Firefox и Chrome.
Пример:
Вы также можете получать уведомления при вставке элементов, связываясь с
DOMNodeInserted
источник
e.target.className
илиif ($(e.target).hasClass('my-class')) { ...
.Нет встроенного события для удаления элементов, но вы можете создать его, используя метод удаления по умолчанию, выдвинутый поддельным расширением jQuery. Обратите внимание, что обратный вызов должен быть вызван до фактического удаления, чтобы сохранить ссылку.
Примечание: некоторые проблемы с этим ответом были изложены другими авторами.
html()
replace()
или других методов jQueryНаиболее элегантное решение этой проблемы выглядит следующим образом: https://stackoverflow.com/a/10172676/216941.
источник
$('#some-element').bind('remove', function(ev) { if (ev.target === this) { console.log('removed!'); } });
Подключаем
.remove()
не самый лучший способ справиться с этим , поскольку есть много способов удаления элементов со страницы (например , с помощью.html()
,.replace()
и т.д.).Чтобы предотвратить различные угрозы утечки памяти, внутренне jQuery попытается вызвать функцию
jQuery.cleanData()
для каждого удаленного элемента независимо от метода, используемого для его удаления.Смотрите этот ответ для более подробной информации: утечки памяти javascript
Таким образом, для достижения наилучших результатов, вы должны подключить
cleanData
функцию, которая является именно тем, что jquery.event.destroyed плагин :http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js
источник
cleanData
было очень полезно для меня! Большое спасибо, Джо :)Для тех, кто использует JQuery UI:
Пользовательский интерфейс jQuery переопределил некоторые методы jQuery для реализации
remove
события, которое обрабатывается не только при явном удалении данного элемента, но также и при удалении элемента из DOM с помощью любых самоочищающихся методов jQuery (напримерreplace
,html
и т. д.) , Это в основном позволяет вам подключить те же события, которые запускаются, когда jQuery «очищает» события и данные, связанные с элементом DOM.Джон Резиг указал, что он открыт для идеи реализации этого события в будущей версии ядра jQuery, но я не уверен, где оно сейчас стоит.
источник
Требуется только jQuery (не требуется jQuery UI)
( Я извлек это расширение из инфраструктуры jQuery UI )
Работает с:
empty()
иhtml()
иremove()
С этим решением вы также можете отменить привязку обработчика событий.
Попытайся! - Пример
Дополнительная демоверсия - jsBin
источник
Я не мог заставить этот ответ работать с отменой привязки (несмотря на обновление, см. Здесь ), но смог найти способ обойти это. Ответ состоял в том, чтобы создать специальное событие destroy_proxy, которое вызвало бы уничтоженное событие. Вы помещаете прослушиватель событий в «destroy_proxy» и «destroy», а затем, когда вы хотите отменить привязку, вы просто отсоединяете «destroy» событие:
Вот скрипка
источник
Мне нравится ответ mtkopone, использующий специальные события jQuery, но учтите, что он не работает а) когда элементы отсоединяются вместо удаления, или б) когда некоторые старые не-jquery библиотеки используют innerHTML для уничтожения ваших элементов
источник
detach
особенно используется, чтобы не запускать очистку, так как элемент, вероятно, планируется подключить позже. b) все еще верно и еще не имеет надежной обработки, по крайней мере, так как события мутации DOM будут широко реализованы.Я не уверен, что для этого есть дескриптор события, поэтому вам нужно будет сохранить копию DOM и сравнить с существующей DOM в каком-то цикле опроса - что может быть довольно неприятно. Firebug делает это, хотя - если вы проверяете HTML и запускаете некоторые DOM-изменения, он выделяет изменения желтым цветом в консоли Firebug на короткое время.
Кроме того, вы можете создать функцию удаления ...
источник
Вот как создать слушатель jQuery live remove :
Или:
источник
Событие "удалить" из jQuery работает нормально, без добавления. Возможно, будет более надежным вовремя использовать простой трюк вместо исправления jQuery.
Просто измените или добавьте атрибут в элемент, который вы собираетесь удалить из DOM. Таким образом, вы можете вызвать любую функцию обновления, которая будет просто игнорировать элементы на пути к уничтожению, с атрибутом "do_not_count_it".
Предположим, у нас есть таблица с ячейками, соответствующими ценам, и вам нужно показать только последнюю цену: это селектор, который срабатывает при удалении ценовой ячейки (у нас есть кнопка в каждой строке таблицы, которая делает это, не показано) Вот)
А вот функция, которая находит последнюю цену в таблице, не учитывая последнюю, если она была удалена. Действительно, когда срабатывает событие «удалить» и когда вызывается эта функция, элемент еще не удален.
В конце концов, функция update_prices () работает нормально, и после этого элемент DOM удаляется.
источник
ссылаясь на ответ @David:
Когда вы хотите сделать soo с другой функцией, например. html () как в моем случае, не забудьте добавить return в новую функцию:
источник
Это.
источник
Расширение ответа Адама, в котором вам нужно заранее указать дефолт, вот обходной путь:
источник
Мы также можем использовать DOMNodeRemoved:
источник