更新:每次提交的帧级加载数量从非零变为零时,都会发生loadstop 事件。在实践中,这通常是一个loadcommit。有关详细信息,请参阅更新的回复。
您在 web 视图中导航(例如,单击链接)和设置 webview.src 属性时观察到的 loadcommit、contentload 和 loadstop 事件大致相同,尽管两者都取决于新的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;这也适用于 loadabort、loadredirect 和 loadstart 事件,但不适用于 loadstop 事件。
每当框架级加载(在顶级框架或内部框架/iframe 中)的数量从非零过渡到零时,都会触发 loadstop 事件。当动态加载帧时(通常是广告的情况),这大致相当于一次一次loadcommit。但是,如果框架不是动态加载的,那么通常页面只会有一个loadstop 事件。
当顶级文档加载完成时会触发contentload 事件。这意味着contentload 事件将不会伴随loadcommit 事件在以下情况下发生:
因此,收听contentload 通常适用于每次加载顶级文档时应仅发生一次的操作(例如,将脚本仅注入特定文档一次)。收听loadcommit 适合对“浏览器即将导航”做出反应(如果您想忽略内部框架/iframe,请务必检查isTopLevel)。收听loadstop 适合对“浏览器完成导航”做出反应,但如果您对顶级事件感兴趣,请小心,因为isTopLevel 属性不会出现在loadstop 事件中。
注意:下面的示例动态加载它们的帧。因此,通常情况是每个loadstop 出现一个loadcommit,但这不能保证,因为如果在第一个完成之前提交第二个内部框架加载,则只有一个loadstop 将在两者都完成后触发。
示例 1
动作
加载http://www.google.com。
结果
loadcommit.isTopLevel=true、contentload、loadstop
说明
这构成加载没有额外框架/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 事件被触发之前被触发。