0

信息:我对javascript一无所知。没有任何。

我很好奇是否有任何方法可以确定网页何时完全加载?假设我有一个爬虫,它使用 webkit 来呈现页面(以及 webkit 的 JS 引擎来解析任何 JS 函数并完成处理 DOM 等),我很好奇是否有任何方法可以知道网页何时“完成”加载?我认为要做的事情:

1) 所有脚本都已执行完毕。2) 没有未决的 AJAX 调用。3) 基于当前可用的信息,对 DOM 进行完整的处理和加载。

对于更具体的假设,通过查看一些网站的来源,我看到它们通过使用将内容注入 DOM 的脚本标签来加载广告,并发出 AJAX 调用来加载和填充广告。如何确定这一切何时完成?

(我想用任何异步替换这个例子。我只是想不出比上面更通用的东西。)

我所说的“检测”是指以任何可能的方式。例如,在页面中注入一些 JS 代码,向页面写入一些内容,让我知道事情已经完成。或者例如使用 QtWebkit,JS 可以调用 C++(我相信),因此 JS 片段可以调用 C++ 函数来让它知道页面何时“加载”。简而言之,无论什么工作。

当前的“幼稚”实现我只是在加载页面后坐下来等待几秒钟。这很傻。

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

非常感谢!

4

1 回答 1

1

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

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

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

许多最近的 JavaScript 库利用这种行为来改善感知页面加载时间,通过加载仅包含第一个屏幕的内容价值和一些脚本的不完整页面,并且直到第一个页面之后才真正开始加载“首屏以下”的图像和内容screenful 左右完成加载和渲染。不过,它对自动化工具、爬虫或那些认为 JavaScript 是受信任网站可以获得的特权的人不是很友好。

于 2010-11-11T08:19:27.157 回答