Brock 的回答很好,但我想为 AJAX 问题提供另一种更现代和优雅的解决方案。
由于他的脚本与大多数其他脚本一样,也使用setInterval()
定期检查(300 毫秒),因此无法立即响应,并且始终存在延迟。其他解决方案使用 onload 事件,它通常会在动态页面上比您想要的更早触发。
您可以使用MutationObserver()
来侦听 DOM 更改并在元素创建后立即响应它们
(new MutationObserver(check)).observe(document, {childList: true, subtree: true});
function check(changes, observer) {
if(document.querySelector('#mySelector')) {
observer.disconnect();
// code
}
}
尽管由于check()
每次 DOM 更改都会触发,如果 DOM 更改非常频繁或者您的条件需要很长时间来评估,这可能会很慢,因此不要观察document
,而是尝试通过观察尽可能小的 DOM 子树来限制范围。
这种方法非常通用,可以应用于很多情况。要多次响应,请不要在触发时断开观察者的连接。
另一个用例是,如果您不寻找任何特定元素,而只是等待页面停止更改,则可以将其与计时器结合使用。
var observer = new MutationObserver(resetTimer);
var timer = setTimeout(action, 3000, observer); // wait for the page to stay still for 3 seconds
observer.observe(document, {childList: true, subtree: true});
// reset timer every time something changes
function resetTimer(changes, observer) {
clearTimeout(timer);
timer = setTimeout(action, 3000, observer);
}
function action(observer) {
observer.disconnect();
// code
}
这种方法非常通用,你也可以监听属性和文本的变化。只需在选项中设置attributes
和characterData
到true
observer.observe(document, {childList: true, attributes: true, characterData: true, subtree: true});