Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在关闭Chrome窗口,但未在卸载事件处理程序中使用sendBeacon发送数据_Javascript_Php_Google Chrome_Onunload_Sendbeacon - Fatal编程技术网

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

Javascript 正在关闭Chrome窗口,但未在卸载事件处理程序中使用sendBeacon发送数据,javascript,php,google-chrome,onunload,sendbeacon,Javascript,Php,Google Chrome,Onunload,Sendbeacon,我试图在窗口关闭时发送数据,以防止两个人编辑和覆盖彼此的数据。目前,我正在卸载事件处理程序中使用sendBeacon 火狐: 刷新:工作 后退按钮:有效 关闭窗口:工作 铬: 刷新:工作 后退按钮:有效 关闭窗口:不工作 这是我的密码 function sendDataOnClose(edit,trans){ var url = "../../save.php"; //This has a post request handler and works pro

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

火狐:

  • 刷新:工作
  • 后退按钮:有效
  • 关闭窗口:工作
铬:

  • 刷新:工作
  • 后退按钮:有效
  • 关闭窗口:不工作
这是我的密码

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); 

上的最新sendBeacon文档声明“navigator.sendBeacon()方法通过HTTP向web服务器异步发送少量数据。它旨在与visibilitychange事件()结合使用,但不与unload和beforeunload事件结合使用。”

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

document.addEventListener('visibilitychange', function() {
  if (document.visibilityState === 'hidden') {
    navigator.sendBeacon(handleClose);
  }
});
我在尝试在
unload
事件上发送数据时遇到了类似的问题。用户是否全部基于桌面?移动设备无法可靠地触发
unload
事件。提供可见性更改事件和
pagehide
事件,这些事件可以一起使用,以更接近所需的结果

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

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

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


多亏了黑客,出于安全原因,许多其他东西都被删除了

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


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

尽管文档中说
unload和beforeunload不是sendBeacon使用的正确事件。相反,使用visibilitychange。
关闭
visibilitychange
事件也不起作用!
pagehide
VisibilityChange
在选项卡关闭时也不会触发。这就是问题所在。我需要任何在窗口关闭时触发但不起作用的事件。请将其拼写为“可见性”而不是“可见性”。我在服务器端已经有超时。我想在用户关闭页面时结束计时器。@括号中的内容非常简单!超时应该会自动过期。注意:每当用户目标或其他用户在脚本启动时输入超时,您应该检查所有超时,并删除丢失的超时。这是一个目标开始时间,以便您可以在上处理关闭页面通过验证开始和停止引用当前php时间()服务器超时;根据超时的不同,请编辑答案以包含此想法。@Janos Vinceller我可以编写一个php mysql脚本来演示“在线用户”开始然后停止php验证程序处理程序,但这不是我100%的想法(在我的情况下,这些情况代码在我需要它之前就已经存在了,在我的框架中,所以我不会检查stackoverflow,因为我知道答案)。关于防止黑客攻击部分,我不会再发布一些东西,可以给我尝试在我的应用程序中停止的同事一些想法。因此,如果你不喜欢答案,我可以删除它