我正在试图找出卸载事件的工作原理。当用户移动到另一个页面时,我正在使用$(window).unload()
处理程序向我的分析服务发送多个自定义值的列表。我为每个值对服务进行单独的API调用。
我只是想知道我是否可以依赖我的处理程序每次运行直到它完成,或者是否有某些情况下加载下一页的JavaScript会在它注册所有值之前中断它列表。
.unload()上的jQuery documentation表示“无法使用.preventDefault()取消卸载事件。”对我而言,这意味着在浏览器开始执行卸载处理程序之后,无法将其从加载,解析和执行新页面的JS中恢复。
但window.onunload
事件中的MDN page表示“在卸载事件发生后处理资源删除。”
这是否意味着浏览器运行页面的卸载功能直到它完成,然后才将其废弃以加载下一页的JS?
答案 0 :(得分:3)
MDN似乎在他们的网站上有多个版本。 Here's another one about unload which describes the state of the document during unload.
卸载
卸载文档或子资源时会触发unload事件。
在以下情况之后解雇:
- beforeunload(可取消事件)
- pagehide
该文件处于特定状态:
- 所有资源仍然存在(img,iframe等)
- 最终用户不再可见
- UI交互无效(window.open,alert,confirm etc.)
- 错误不会停止卸载工作流程
据我所知,异步请求(ajax)可能会被触发但不能保证它们会到达服务器甚至脱离浏览器。
在您的某个标记(分析)的上下文中,您似乎想知道用户何时离开该页面。
为什么不对服务器进行心跳/常规ping操作?最后一次已知的ping可以用作对用户上次在该页面上看到的时间的估计。
或者将用户离开页面的时间存储在cookie中,就像某种“待处理报告”一样。这可以在unload
内执行。下次您的脚本遇到cookie时,请将其解析为待处理数据并将其发送到服务器。