我宁愿定期检查状态(https://developer.mozilla.org/en-US/docs/Web/API/document.readyState)。尽管这种方法有点笨拙,但您可以确定在函数内部使用完全加载的文档。document.readyState
onPageReady
var page = require("webpage").create(),
url = "http://example.com/index.html";
function onPageReady() {
var htmlContent = page.evaluate(function () {
return document.documentElement.outerHTML;
});
console.log(htmlContent);
phantom.exit();
}
page.open(url, function (status) {
function checkReadyState() {
setTimeout(function () {
var readyState = page.evaluate(function () {
return document.readyState;
});
if ("complete" === readyState) {
onPageReady();
} else {
checkReadyState();
}
});
}
checkReadyState();
});
附加说明:
使用嵌套而不是防止在由于某些随机原因而延长其执行时出现“重叠”和争用条件。 默认延迟为 4ms (https://stackoverflow.com/a/3580085/1011156),因此主动轮询不会对程序性能产生严重影响。setTimeout
setInterval
checkReadyState
setTimeout
document.readyState === "complete"
表示文档完全加载了所有资源(https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness)。
编辑2022:我在8年前创建了这个响应,从那时起我就没有使用PhantomJS。在某些情况下,它现在很可能不起作用。此外,现在我认为不可能创建一个一刀切的解决方案来绝对确保页面已加载。这是因为某些页面可能会在文档准备就绪后加载其他资源。例如,网站上可能有一些JS代码等待文档准备就绪,然后加载一些其他资产(在文档状态更改为之后) - 在这种情况下,将触发,之后页面将再次开始加载更多资源。ready
onPageReady
我仍然认为上面的截图是一个很好的起点,在大多数情况下可能有效,但也可能是创建特定解决方案来处理特定网站的必要条件。