【问题标题】:When is a webpage considered to be "loaded", in the presence of JS etc在存在 JS 等的情况下,何时认为网页被“加载”
【发布时间】:2010-11-11 16:27:56
【问题描述】:

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

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

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

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

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

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

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

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

非常感谢!

【问题讨论】:

    标签: javascript qt webkit rendering webpage-rendering


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 使用 loadFinished(bool) 似乎并不能保证所有脚本都至少执行一次。只是资源已经下载完毕。
    • 你如何定义“所有脚本都已执行”?任何加载了<script src=...> 的东西都必须在loadFinished 触发时执行。唯一的问题是它的执行可能只包含定义一些函数和设置一个计时器回调,它会在未来的某个时间获得更多内容,但是你永远不会知道,因为这不再是页面加载正确——它只是脚本代码在做它的事情。
    • 该死的。好的,有什么方法可以获取当前设置的计时器事件,例如,在页面上?谢谢!
    • 我想不出任何既不是侵入性的,也不是纯粹的丑陋的。 JavaScript window 对象包含所有计时器;您可以深入研究 WebKit 的 window 实现,或者您可以抓住 javaScriptWindowObjectCleared 信号,将一些监控对象插入其中,然后评估拦截并重定向 setTimeoutsetInterval 的 JavaScript 块window 上的方法到您的对象。公共window API 不允许枚举活动计时器。您可能还需要查看body 标签的onload 回调。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2013-11-21
    • 2010-12-28
    • 2021-07-27
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多