Brock的回答很好,但是我想为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);}})();
用来连续轮询元素的存在。那是最通用的解决方案。