曾经有个需求,需要判断页面是否离开或刷新,进行提示,根据用户的选择停留在当前页面或离开。对此问题,直觉当然是监听浏览器的onbeforeunload事件,在回调中进行判断处理。

但,问题来了,在页面中点击a标签模拟的按钮时,也会触发此事件,同样,正常的submit提交也会触发。而且,无法自定义弹窗的样式和提示的消息。

因此,为一探究竟,首先需要明确onbeforeunload事件的触发时机。

根据MSDN,IE的onbeforeunload事件可由以下条件触发:

  1. 关闭当前浏览器窗口;
  2. 导航到另一个新的地址或选择一个喜欢的位置;
  3. 单击后退、前进、刷新、或主页按钮;
  4. 点击一个链接到新页面;
  5. 调用超链接的click方法;
  6. 调用document.write方法;
  7. 调用document.open方法;
  8. 调用document.close方法;
  9. 调用window.close方法;
  10. 调用window.open 方法,窗口名称设置值为_self;
  11. 调用window.navigate或NavigateAndFind 方法;
  12. 调用location.replace方法;
  13. 调用location.reload方法;
  14. 指定一个location.href属性的新值;
  15. 使用submit按钮提交表单,或调用form.submit方法。

由此可见,任何涉及到a、document、window、location、submit等等的操作都会触发此事件,其影响范围相当广泛,并不适合此场景。为此,需要另辟蹊径,只能通过常规的事件绑定方式实现。

对reload、链接的click,以及部分button、tab进行监听(对于dom元素事件,可以通过关联class),然后在统一的事件处理回调中判断事件源进行过滤。以此,即可实现自定义的提示样式和消息,且只在预期的行为中触发。