【问题标题】:chrome app webview event definitions and orderchrome app webview 事件定义和顺序
【发布时间】:2014-06-11 20:53:10
【问题描述】:

我正在开发一个包含 webview 标记的 Chrome 应用程序来显示网络内容。

我无法理解在 web 视图中加载页面的过程中,contentloadloadcommitloadstop 事件何时真正触发。

1) 有人可以描述(比文档更详细和上下文)我可以预期这些事件何时触发吗?
2) 另外,当/如果我更改 webview 的 src (url) 时会发生什么?这些事件会与 webview 的初始加载(或根本加载)不同,还是会与第一页的加载相同?

https://developer.chrome.com/apps/tags/webview

【问题讨论】:

    标签: google-chrome webview google-chrome-app


    【解决方案1】:

    更新:每次提交的帧级加载数量从非零变为零时,都会发生loadstop 事件。在实践中,这通常是一个loadcommit。有关详细信息,请参阅更新的回复。

    您在 web 视图中导航(例如,单击链接)和设置 webview.src 属性时观察到的 loadcommitcontentloadloadstop 事件大致相同,尽管两者都取决于新的URL 是指当前加载的文档。这些事件取决于浏览器导航真正的文档加载之间的区别。请注意,在您的问题中,“浏览器”是 webview。

    总结

    • 顶级文档 (loadcommit.isTopLevel=true) 以及任何框架/iframe (loadcommit.isTopLevel=false) 内的每个浏览器导航都会触发 loadcommit 事件。

    • 每当框架级加载(在顶级框架或内部框架/iframe 中)的数量从非零过渡到零时,就会触发 loadstop 事件。当动态加载帧时(通常是广告的情况),这大致相当于一次一次loadcommit

    • 每次顶级文档加载都会触发一个contentload 事件(通常在其关联的loadstop 事件之前);这不包括框架/iframe 文档加载和不加载新文档的顶级浏览器导航。

    详情

    您的浏览器完全有可能在不加载新文档的情况下导航到新位置。示例包括单击跳转到当前文档中某个位置的链接,以及 AJAX 工作流,其中开发人员在加载某些异步获取的内容时使用a browser history API 强制导航。当然,大多数浏览器导航确实会导致浏览器加载新文档。这构成了我所说的真正的文档加载

    每次浏览器导航都会发生loadcommit 事件。这些事件会为顶级文档中的每个导航以及文档中的每个框架/iframe(以及框架/iframe 中的框架/iframe 等)触发。这就是为什么在许多情况下,您会看到几个 @ 987654339@ 加载单个顶级文档的事件。请注意,只有顶级loadcommit 事件有isTopLevel=true;这也适用于 loadabortloadredirectloadstart 事件,但不适用于 loadstop 事件。

    每当框架级加载(在顶级框架或内部框架/iframe 中)的数量从非零过渡到零时,都会触发 loadstop 事件。当动态加载帧时(通常是广告的情况),这大致相当于一次一次loadcommit。但是,如果框架不是动态加载的,那么通常页面只会有一个loadstop 事件。

    当顶级文档加载完成时会触发contentload 事件。这意味着contentload 事件将不会伴随loadcommit 事件在以下情况下发生:

    • loadcommit 事件不适用于顶层框架,

    • loadcommit 事件与不构成真正的页面加载的浏览器导航相关联。

    因此,收听contentload 通常适用于每次加载顶级文档时应仅发生一次的操作(例如,将脚本仅注入特定文档一次)。收听loadcommit 适合对“浏览器即将导航”做出反应(如果您想忽略内部框架/iframe,请务必检查isTopLevel)。收听loadstop 适合对“浏览器完成导航”做出反应,但如果您对顶级事件感兴趣,请小心,因为isTopLevel 属性不会出现在loadstop 事件中。

    注意:下面的示例动态加载它们的帧。因此,通常情况是每个loadstop 出现一个loadcommit,但这不能保证,因为如果在第一个完成之前提交第二个内部框架加载,则只有一个loadstop 将在两者都完成后触发。

    示例 1

    动作

    加载http://www.google.com

    结果

    loadcommit.isTopLevel=truecontentloadloadstop

    说明

    这构成加载没有额外框架/iframe 的页面。文档在loadstop 事件触发之前就准备好了。一般情况下似乎是这样,但不知道能不能保证。

    示例 2

    动作

    来自http://www.google.com,输入搜索短语并等待“即时搜索”加载搜索结果。

    结果

    loadcommit.isTopLevel=true, loadstop

    说明

    这构成了页面导航,无需加载新文档。请注意,URL 的锚点部分发生了变化。

    示例 3

    动作

    加载http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_iframe

    结果

    loadcommit.isTopLevel=true、[几个loadcommit.isTopLevel=false、一个contentload和几个loadstop——不一定按这个顺序]

    说明

    这构成了加载具有多个内部框架的文档(除了示例 iframe 之外还有广告)。您会观察到触发的loadstop 事件的数量永远不会超过loadcommit 事件的数量(因为您无法在开始加载之前完成加载)。同样,您几乎肯定会看到contentload 事件在至少一个loadstop 事件被触发之前被触发。

    【讨论】:

    • 赏金,这个答案。
    • 很好的答案!非常感谢。
    猜你喜欢
    • 2016-11-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多