卸载事件处理程序是否保证在加载下一页之前完成执行?

问题描述 投票:6回答:1

我想弄清楚卸载事件是如何工作的。当用户移动到另一个页面时,我正在使用$(window).unload()处理程序向我的分析服务发送几个自定义值的列表。我为每个值对服务进行单独的API调用。

我只是想知道我是否可以依赖我的处理程序每​​次运行直到它完成,或者是否有一些情况下加载下一页的JavaScript会在它注册列表中的所有值之前中断它。

.unload()上的jQuery documentation说“用.preventDefault()取消卸载事件是不可能的。”对我而言,这意味着在浏览器开始执行卸载处理程序之后,无法将其从加载,解析和执行新页面的JS中恢复。

MDN page事件中的window.onunload说:“在卸载事件发生后,资源移除将被处理。”

那么这是否意味着浏览器运行页面的卸载功能直到它完成,然后才将其废弃以加载下一页的JS?

javascript jquery browser analytics dom-events
1个回答
3
投票

MDN似乎在他们的网站上有多个版本。 Here's another one about unload which describes the state of the document during unload.

unload

卸载文档或子资源时会触发unload事件。

它被解雇后:

  • beforeunload(可取消事件)
  • pagehide

该文件处于特定状态:

  • 所有资源仍然存在(img,iframe等)
  • 最终用户不再可见
  • UI交互无效(window.open,alert,confirm等)
  • 错误不会停止卸载工作流程

据我所知,异步请求(ajax)可能会被触发但不能保证它们会到达服务器甚至脱离浏览器。


在您的某个标记(分析)的上下文中,您似乎想知道用户何时离开该页面。

  • 为什么不对服务器进行心跳/常规ping?最后一次已知的ping可以用作对用户最后一次在该页面上看到的时间的估计。
  • 或者将用户离开页面的时间存储在cookie中,就像某种“待处理报告”一样。这可以在unload内执行。下次您的脚本遇到cookie时,将其解析为待处理数据并将其发送到服务器。
© www.soinside.com 2019 - 2024. All rights reserved.