如何判断页面的js渲染完毕

2013-05-04 14:47:57 +08:00
 sivacohan
目前在玩phantomjs,想要把网页转换成图片。

但是现在很多网页的js采用异步加载的方式。比如require.js,sea.js之类的东西。

这种情况造成了页面还没有渲染完成,phantomjs已经调用render了。这样网页会有元素的缺失。

在邮件列表提问,得到的答复是,写个sleep函数,占用时间。但是这种方便并不理想。

那么,在这种情况下,我如何比较准确的判断js加载并且渲染完毕呢?
14221 次点击
所在节点    JavaScript
3 条回复
otakustay
2013-05-04 16:50:10 +08:00
这个问题的核心不是技术,而是什么是“js渲染完毕”。
我举个例子,有一个页面,每5秒从后端拉一次数据,在页面上更新几个条目,永远这样不结束,那么这个页面什么时候“渲染完毕”?

如果你可以定出一个渲染完毕的标准,那么你就可以通过定时地检测这个标准来判断,比如下面的代码是把“一个id叫username的span元素出现”作为标准的(不少网站是页面展现完再去加载一次当前用户信息,在右上角显示个用户名,以此为例):

function check() {
// 在这里写你自已的标准
return document.getElementById('username');
}
function waitForReady() {
if (!check()) {
return setTimeout(waitForReady, 50); // 每50毫秒检查一下
}
else {
// phantom与页面的通信推荐用alert来做
alert('ready');
}
}
waitForReady();

在phantom中的代码这么来(已经有点忘了phantom的API了):
var page = new WebPage();
page.onAlert = function (message) {
if (message === 'ready') {
takeScreenshot(page); // 截图
}
}
page.open(url, function () { console.log('page loaded but not ready'); });
sivacohan
2013-05-04 18:53:54 +08:00
@otakustay 谢谢
ghbjy1128
2013-05-05 06:59:58 +08:00
js渲染? 如果是想得到JS的运行状态的话,当然是创建自定义事件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX