我想提供另一种更现代、更优雅的解决方案来解决AJAX问题。
像大多数解决方案一样,
Brock的脚本使用
setInterval()
或
setTimeout()
来定期检查元素,因此无法立即响应,总会有一些延迟。其他解决方案使用
onload
事件,在动态页面上往往会提前触发。
解决方案:使用
MutationObserver()
直接监听DOM变化,以便在元素插入后立即响应。
(new MutationObserver(check)).observe(document, {childList: true, subtree: true});
function check(changes, observer) {
if(document.querySelector('#mySelector')) {
observer.disconnect();
}
}
每次DOM更改后,
check
函数会立即触发。这允许您指定任意的触发条件,以便在执行自己的代码之前等待页面处于所需的确切状态。
请注意,如果DOM经常更改或者您的条件需要很长时间来评估,这可能会很慢,因此尽量通过观察尽可能小的DOM子树来限制范围,而不是观察
document
。
这种方法非常通用,可以应用于许多情况。要多次响应,只需在触发时不断开观察者的连接。
另一个用例是,如果您不寻找任何特定的元素,而只是等待页面停止更改,您可以将其与一个空闲计时器结合使用,该计时器在页面更改时被重置。
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(observer) {
observer.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) { /* 对计数器元素进行操作 */ } else { setTimeout(init, 0);}})();
来持续轮询元素的存在性。这是最通用的解决方案。 - Rob W@run-at
值,其中包括document-idle
和context-menu
,这可能会有用。另外,看起来油猴正在添加支持document-idle
尽管它目前还没有被记录下来。 - Mr. Llama