Відповідь Брока хороша, але я хотів би запропонувати ще одне рішення проблеми AJAX, яке є більш сучасним та елегантним. Оскільки його сценарій також використовує setInterval()
для періодичної перевірки (300 мс), він не може негайно відповісти.
Якщо вам потрібно негайно відповісти, ви можете використати MutationObserver()
для прослуховування змін DOM і відповіді на них, як тільки елемент буде створений
(new MutationObserver(check)).observe(document, {childList: true, subtree: true});
function check(changes, observer) {
if(document.querySelector('#mySelector')) {
observer.disconnect();
}
}
Хоча відтоді check()
пожежа відбувається при кожній зміні DOM, це може бути повільним, якщо DOM змінюється дуже часто або ваш стан займає багато часу для оцінки.
Інший варіант використання - якщо ви не шукаєте якийсь конкретний елемент, а просто чекаєте, поки сторінка перестане змінюватися. Ви можете поєднати це з setTimeout()
тим, щоб теж зачекати.
var observer = new MutationObserver(resetTimer);
var timer = setTimeout(action, 3000, observer);
observer.observe(document, {childList: true, subtree: true});
function resetTimer(changes, observer) {
clearTimeout(timer);
timer = setTimeout(action, 3000, observer);
}
function action(o) {
o.disconnect();
}
Цей метод настільки універсальний, що ви також можете прослуховувати зміни атрибутів та тексту. Просто встановіть attributes
і characterData
щоб true
в опціях
observer.observe(document, {childList: true, attributes: true, characterData: true, subtree: true});
(function init(){var counter = document.getElementById('id-of-element');if (counter) { /* do something with counter element */ } else { setTimeout(init, 0);}})();
для постійного опитування щодо існування елемента. Це найбільш загальне рішення.