【问题标题】:Event onbeforeunload isn't fired in Chrome Incognito在 Chrome 隐身模式中未触发 onbeforeunload 事件
【发布时间】:2020-05-29 17:20:32
【问题描述】:

我一直在尝试在beforeunload 上发送信标,它似乎可以在几乎所有现代浏览器上运行,除了处于隐身模式的 Chrome。

这是适用于所有现代浏览器的代码,除了处于隐身模式的 Chrome:

window.onbeforeunload = function() {
    navigator.sendBeacon("url");
}

甚至这段代码似乎都不起作用:

window.onbeforeunload = function() { 
    console.log('before unload') 
}

我做错了什么还是只是 Chrome 的错?

【问题讨论】:

  • 您发布的 sn-p 在 Windows 10、Chrome 80.0.3987.87 incognito 上为我工作
  • 我不需要它是 100% 可靠的,但我很好奇为什么它在隐身模式下不起作用。另外我不想向用户发送消息,只是向服务器发送信标。
  • 在隐身模式下很可能会禁止所有阻止操作,因此可能会触发卸载事件,但在窗口/导航器实例被破坏之前您的功能不会完成......一个疯狂的猜测......你可以尝试添加一个静态 iframe 并尝试从中触发卸载,将 som JS 代码放在“srcDoc”属性中
  • 隐身不是正确的测试方式。在隐身模式下,您仍然激活了插件,这可能会干扰测试。您应该尝试使用访客模式。

标签: javascript google-chrome beacon sendbeacon


【解决方案1】:

你的设置是什么(所以,Chrome 版本)?

在 Chrome 80.0.3987.116 / Ubuntu 64 和 Chrome 79.0.3945.130 / Windows 10 上,以下 sn-p 无法正常工作:

window.addEventListener('beforeunload', (event) => {
  console.log("BEFORE")
  navigator.sendBeacon("http://www.google.it");
  // Cancel the event as stated by the standard.
  event.preventDefault();
  // Chrome requires returnValue to be set.
  event.returnValue = '';
});

在卸载前发送的请求(隐身模式)屏幕:

此外,请注意:

为了防止不需要的弹出窗口,某些浏览器不显示提示 在 beforeunload 事件处理程序中创建,除非页面已经 与之互动。此外,有些根本不显示它们。

参考:https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload

【讨论】:

  • 我不想显示提示,只是为了在不影响用户离开网站的情况下发送信标。
  • 上面的sn-p显示了dialog和console.log
  • navigator.sendBeacon(url, data) 的输出是什么?
  • 我不希望它显示任何日志,只是为了发送信标。
  • 在隐身会话中查看我的编辑和屏幕
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2014-02-15
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多