关闭Chrome窗口未在卸载事件处理程序中使用sendBeacon发送数据

如何解决关闭Chrome窗口未在卸载事件处理程序中使用sendBeacon发送数据

我正在尝试在窗口关闭时发送数据,以防止2个人编辑和覆盖彼此的数据。目前,我正在卸载事件处理程序中使用sendbeacon

FireFox:

  • 刷新:有效
  • 返回按钮:有效
  • 关闭窗口:有效

Chrome浏览器:

  • 刷新:有效
  • 返回按钮:有效
  • 关闭窗口:不起作用

这是我的代码

function sendDataOnClose(edit,trans){

    var url = "../../save.PHP"; //This has a post request handler and works properly with other functions for saving data

    const data = JSON.stringify
    ({
      "translations": trans,"edit": edit
    });

    navigator.sendbeacon(url,data);
  }

function handleClose(){
    if(edit){
      console.log("sending a false when edit is: "+ edit)
      sendDataOnClose(false,translations);
    }
  }

window.addEventListener('unload',handleClose); 

解决方法

MDN 上的最新 sendBeacon 文档指出“navigator.sendBeacon() 方法通过 HTTP 异步发送少量数据到 Web 服务器。它旨在与visibilitychange 事件(但不适用于 unload 和 beforeunload 事件)。”

要像建议的那样使用 visibilitychange 事件,您可以

document.addEventListener('visibilitychange',function() {
  if (document.visibilityState === 'hidden') {
    navigator.sendBeacon(handleClose);
  }
});

我在尝试在 unload 事件上发送数据时遇到了类似的问题。用户群都在桌面上吗?移动设备不能可靠地触发 unload 事件。 Page Lifecycle API 提供可见性更改事件和 pagehide 事件,它们可以一起使用以更接近您想要的结果。

页面生命周期 API 尝试通过以下方式解决此问题: 在网络上引入和标准化生命周期状态的概念。 定义新的系统启动状态,允许浏览器限制隐藏或非活动选项卡可以使用的资源。 创建新的 API 和事件,允许 Web 开发人员响应这些新的系统启动状态之间的转换。 source

您遇到的问题可能更像是一个与浏览器如何暂停页面或完全丢弃页面无关的问题。不幸的是,浏览器在如何实现这一点上并不统一,而且更复杂的是,桌面和移动设备上的行为有所不同。

如果您有兴趣,有几个线程可以更深入地探讨这个问题。在浏览器对此进行标准化之前,我不确定是否有一个简单的答案,例如 “使用 x 事件”

Issue filed on Page Visibility

Issue on MDN's strints about sendBeacon

,

感谢黑客,出于安全原因删除了许多其他内容。

我注意到你的问题也有 PHP 标签;我会给你一个,不是好主意,而是一个实用的主意。避免关闭页面处理甚至 JavaScript 或框架只是用 JavaScript 发布一个表数据库,您在其中存储 time() 和目标 id,然后如果超时可能超过 30 秒,那么您将从表中删除那些东西,并且您会知道该页面仍然无法正常工作(翻译:使用服务器“在线用户”的想法(不好但必要的想法,就像任何会在应用中产生大量流量的东西一样)。

在侧客户端的 JavaScript 中使用这些是个坏主意,你会为利用你的应用程序的坏人打开大门。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?