什么时候被认为是“加载”的网页,在JS等存在

问题描述:

信息:我不知道的JavaScript。没有。什么时候被认为是“加载”的网页,在JS等存在

我很好奇,如果有什么方法可以确定网页何时完全加载?比方说,我有一个爬虫,它使用webkit来渲染页面(和webkit的JS引擎来解析任何JS函数,并完成处理DOM等),我很好奇,如果有什么方法知道网页何时“完成”加载?我认为要做的事:

1)所有的脚本都已经完成执行。 2)没有待处理的AJAX调用。 3)根据当前可用的信息完整处理和加载DOM。

对于一个更具体的假设,通过查看几个网站的来源,我发现他们通过使用脚本标记来加载广告,该标记注入DOM中的东西,并发出AJAX调用来加载和填充广告。如何确定这一切何时完成?

(通过任何异步替换的例子,我想,我只是想不出什么比上述更普遍的。)

通过“检测”,我的意思是,在任何方式可能。例如,将一些JS代码注入页面,将某些内容写入页面以让我知道所做的事情。或者例如用QtWebkit,JS可以调用C++(我相信),所以JS片段可以调用C++函数来让它知道页面何时“加载”。无论什么作品,总之。

当前'天真'的实现,我刚刚坐着,并在加载一页后等待几秒钟。这很傻。

请尽可能详细,如果在理解答案之前需要更多背景信息,请随时说'先阅读'。

非常感谢!

通常不可能说出包含异步脚本驱动内容的页面是否真正完成加载。除了halting problem的基本问题之外,脚本或插件可以注册周期性定时器事件,并可以无限期地继续修改或添加到页面。

我通常看到的用于确定何时完成页面加载的方法是当整个DOM已经加载时,直接从该DOM引用的资源(图像,样式表,脚本等)已被加载,并且所有脚本代码已被读取并执行一次。通过document.write()发送的文本被视为用于此目的,就好像它直接包含在源HTML中一样。如果您使用的是QtWebKit,我相信这是您连接到信号QWebPage::loadFinished(bool)时会看到的行为。通过计时器(您可以使用访问page()得到一个QWebFrame所包含QWebPage。)

递延行动由脚本代码设置,是否在等待其他资源的加载事件来完成,或者你有什么,是不是计算;媒体播放器和其他插件可能会使事情进一步复杂化,因为每种媒体类型甚至播放器对于“已加载”的内容可能具有不同的标准。

许多最近的JavaScript库都利用这种行为,通过加载一个不完整的页面来提高感知页面的加载时间,该页面只包含第一个屏幕的内容加上一些脚本,而实际上并没有开始加载图像和内容“直到第一个screenful完成后才完成加载和渲染。不过,对于自动化工具,抓取工具或那些认为JavaScript可以被信任站点获得特权的用户来说,这并不是非常友好。

+0

使用loadFinished(bool)似乎并不能保证所有脚本至少执行过一次。只是资源已被下载。 – 2010-11-11 08:29:34

+0

你如何定义“所有脚本已经执行”?任何加载了'

+0

该死的。好的,有什么方法可以获得当前设置的计时器事件,例如,在页面上?谢谢! – 2010-11-11 20:06:05