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