我正在开发一个包含webview标记的Chrome应用,以显示网络内容。
我无法理解在网页浏览中加载网页的过程中contentload
,loadcommit
和loadstop
事件实际触发的时间。
1)当我可以期待这些事件发生时,有人可以描述(比文档更详细和更具背景)吗? 2)此外,当我/如果我更改webview的src(url)时会发生什么?这些事件的启动方式是否与webview的初始加载时(或者根本不同)或者与第一页的加载相同?
答案 0 :(得分:5)
UPDATE :每次提交的帧级加载数从非零转换为零时,都会发生loadstop
事件。在实践中,这通常是每个loadcommit
一个。有关详细信息,请参阅更新的响应。
您在网页浏览中导航时观察到的loadcommit
,contentload
和loadstop
事件(例如,点击链接)并设置webview.src
属性大致相同,但两者都取决于新URL是否引用当前加载的文档。这些事件取决于浏览器导航与正版文档加载之间的差异。请注意,在您的问题的上下文中,"浏览器"是webview。
在顶级文档(loadcommit
)内以及任何框架/ iframe(loadcommit.isTopLevel=true
)内的每个浏览器导航都会触发loadcommit.isTopLevel=false
个事件。
每次帧级加载的数量(在顶级框架或内部框架/ iframe中)从非零转换为零时,都会触发loadstop
事件。当动态加载框架时(通常是广告的情况),这大致相当于每loadcommit
一次。
每个顶级文档加载都会触发contentload
事件(通常在其关联的loadstop
事件之前);此排除框架/ iframe文档加载以及未加载新文档的顶级浏览器导航。
您的浏览器完全可以导航到新位置而无需加载新文档。示例包括单击跳转到当前文档中某个位置的链接,以及AJAX工作流,其中开发人员使用a browser history API强制导航,同时加载某些异步提取的内容。当然,大多数浏览器导航确实会导致浏览器加载新文档;这构成了我所称的真正的文档加载。
每个浏览器导航都会发生loadcommit
个事件。这些事件是针对顶级文档中的每个导航以及文档中的每个框架/ iframe(以及框架/ iframe中的框架/ iframe等)触发的。这就是为什么在很多情况下,您会看到多个{ {1}}事件加载单个顶级文档。请注意,只有顶级loadcommit
个事件有loadcommit
;这也适用于isTopLevel=true
,loadabort
和loadredirect
个事件,但不是 loadstart
个事件。
每次帧级加载(在顶级帧或内部帧/ iframe中)从非零转换为零时,都会触发loadstop
事件。当动态加载帧时(通常是广告的情况),这大致相当于每次loadstop
一次。但是,如果未动态加载帧,则通常页面只会有一个loadcommit
事件。
顶级文档加载完成时会触发loadstop
事件。这意味着contentload
事件在contentload
事件发生时不会出现:
loadcommit
事件不适用于顶级框架
或强>
loadcommit
事件与不构成正版页面加载的浏览器导航相关联。
因此,监听loadcommit
通常适用于每个顶级文档加载应该发生一次的操作(例如,将脚本恰好注入某些文档一次)。聆听contentload
适合对#34;浏览器即将导航" (如果您想忽略内部框架/ iframe,请务必检查loadcommit
)。聆听isTopLevel
适合对浏览器完成导航"做出反应,但如果您对顶级活动感兴趣,请务必小心,因为loadstop
属性并非如此; t出现在isTopLevel
个事件中。
注意:以下示例动态加载其帧。因此,通常情况每loadstop
出现一个loadstop
,但这不能保证,因为如果第二个内部帧加载在第一个之前提交完成后,只有一个loadcommit
将在两个完成后触发。
loadstop
,loadcommit.isTopLevel=true
,contentload
这表示加载没有额外框架/ iframe的页面。在loadstop
事件触发之前,该文档已准备就绪。这似乎是一般的情况,但我不知道它是否有保障。
从http://www.google.com,输入搜索词组,然后等待"即时搜索"加载搜索结果。
loadstop
,loadcommit.isTopLevel=true
这构成了不加载新文档的页面导航。请注意,URL的锚点部分会发生变化。
加载http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_iframe。
loadstop
,[多个loadcommit.isTopLevel=true
,一个loadcommit.isTopLevel=false
和多个contentload
- 不一定按此顺序]
这构成了加载具有多个内部框架的文档(除了样本iframe之外还有广告)。您将观察到loadstop
事件的数量永远不会超过loadstop
事件的数量(因为您无法在开始加载之前完成加载)。同样,在至少有一个loadcommit
事件被触发之前,您几乎肯定会看到contentload
事件被触发。