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

时间:2014-02-24 11:52:23

标签: javascript jquery browser analytics dom-events

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

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

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

window.onunload事件中的MDN page表示“在卸载事件发生后处理资源删除。”

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

1 个答案:

答案 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时,请将其解析为待处理数据并将其发送到服务器。