Проверьте, готов ли данный элемент DOM
Есть ли способ проверить, готовы ли элементы HTML/DOM для данного селектора/элемента, используя jQuery или JavaScript?
Глядя на jQuery api для функции готовности, похоже, что он может использоваться только с объектом документа. Если готовый не может быть использован для этой цели, есть ли другой способ сделать это?
например.
$('h1').ready(function()
{
//do something when all h1 elements are ready
});
Очевидно, я мог бы использовать
$(document).ready(function()
{
//do something when all h1 elements are ready
});
Но если вся загрузка h1 сначала, то код, специфичный для элементов h1, будет выполняться только после того, как весь документ будет готов, даже если он действительно может выполнить ранее.
Ответы
Ответ 1
Изменить 2012
Метод live
устарел из jQuery 1.7.0. . On() событие теперь рекомендуется для привязки обработчиков событий. Это заменяет .bind(),.delegate() и .live().
См. документы: http://api.jquery.com/on/
Оригинальный ответ
Я думаю, jQuery.live() событие может быть тем, что вы ищете.
Ответ 2
Да, это возможно: и хотя он не является родным, его довольно легко внедрить. Просто вызовите пользовательское событие после того, как node, который вы ищете, загружается в DOM.
Примечание. Я пишу это в jQuery, а это значит, что вам нужно включить jQuery в начале процесса загрузки, что не так уж и плохо. При этом, если у вас уже есть jQuery высоко в вашем документе, или если DOM-конструкция принимает для вас долгое время, это может быть полезно. В противном случае вы можете написать это в vanilla JS, чтобы пропустить зависимость $.
<!DOCTYPE HTML>
<html><head><title>Incremental DOM Readyness Test</title></head><body>
<script src="/js/jquery.js"></script>
<script>
jQuery(document.body).on("DOMReady", "#header", function(e){
var $header = jQuery(this);
$header.css({"background-color" : "tomato"});
}).on("DOMReady", "#content", function(e){
var $content = jQuery(this);
$content.css({"background-color" : "olive"});
});
</script>
<div class="header" id="header">
<!-- Header stuff -->
</div>
<script>jQuery("#header").trigger("DOMReady");</script>
<div class="content" id="content">
<!-- Body content. Whatever is in here is probably really slow if you need to do this. -->
</div>
<script>jQuery("#content").trigger("DOMReady");</script>
</body></html>
Ответ 3
Ответ, вероятно, нет. с точки зрения браузера это, вероятно, плохой дизайн и, возможно, даже невозможно позволить что-то вроде этого.
для динамически вставленных элементов после готовности DOM есть событие dom - DOMNodeInserted - которое вы можете использовать. вы также можете использовать jquery live, как указано выше, что, вероятно, использует одно и то же событие.
Ответ 4
-------- 2016 --------
Я пришел с возможным решением, используя promises, который может помочь кому-то другому, я использую jquery
, потому что я ленив: P.
Довольно много ждет, пока существует dom
, а затем выполните функцию разрешения в обещании:
var onDomIsRendered = function(domString) {
return new Promise(function(resolve, reject) {
function waitUntil() {
setTimeout(function() {
if($(domString).length > 0){
resolve($(domString));
}else {
waitUntil();
}
}, 100);
}
//start the loop
waitUntil();
});
};
//then you can use it like
onDomIsRendered(".your-class-or-id").then(function(element){
console.log(element); //your element is ready
})
Ответ 5
Для меня работал фрагмент кода
<print condition="true"></print>
<script>
$('print').load('#',function(){
alert($(this).attr('condition'));
});
</script>