#jquery
#jquery ( jquery )
Вопрос:
когда мы используем $("selector").remove()
для любого элемента, он будет немедленно удален и $("selector").remove()
является синхронным методом, поэтому следующий оператор будет выполнен при удалении элемента. Но в моем случае элемент все еще доступен после его удаления.
$("#click1").on("click", function() {
$(this).remove();
alert($(this).text());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="click1">
click on me
</button>
Мой вопрос в том, если элемент удален (из dom) Как я все еще могу получить к нему доступ $(this).text()
?
есть какие-нибудь идеи?
Обновить:
В любом другом случае этого не происходит
$("#click1").on("click", function() {
$(this).remove();
alert($(this).text());
});
$("#click2").on("click", function() {
$("#click1").remove();
alert($("#click1").text());
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="click1">
click on me
</button>
<button id="click2">
click on me too
</button>
Теперь вторая кнопка, немедленно удалите элемент, и меня больше нет, получите доступ к элементу (даже спустя очень мало времени)
Комментарии:
1.
remove()
метод просто извлекает элемент из DOM2. Это ожидаемое поведение.
$.fn.remove()
удаляет элемент из DOM, а не любую ссылку на него3. Разве это не здорово, что объекты не исчезают из существования, потому что вы удалили их со страницы?
4. Следующее редактирование связано с тем, что
$("#click1")
выполняется поиск в DOM, и там элемент больше не существует, поэтому он возвращает пустой набор jq.
Ответ №1:
jQuery использует removeChild
внутренне, и в документации указано
Удаленный дочерний узел все еще существует в памяти, но больше не является частью DOM.
…вы можете повторно использовать удаленный узел позже в своем коде,
… предполагая, что ваш код не сохранил никаких других ссылок на узел в другом месте, он немедленно станет непригодным для использования и безвозвратным и обычно автоматически удаляется из памяти через короткое время.
В вашем обработчике событий this
все еще ссылается на узел, поэтому он не удаляется из памяти и может использоваться до тех пор, пока у вас есть ссылка на узел
Когда вы снова выполняете $("#click1")
jQuery uses .getElementById
для извлечения элемента из DOM, но его больше нет в DOM, он был удален.
Ответ №2:
В общем, объекты существуют до тех пор, пока на них существует ссылка.
В вашем первом примере:
$(this).remove();
alert($(this).text());
… у вас все еще есть ссылка на объект после его удаления (в this
), поэтому объект все еще существует, и вы можете получить его текст (его дочерние узлы все еще существуют, потому что у него есть ссылки на них).
В вашем втором примере:
$("#click1").remove();
alert($("#click1").text());
…. после удаления элемента из документа вы пытаетесь найти его, просмотрев его в документе. Его больше нет в документе, поэтому неудивительно, что вы его не нашли.