Javascript Safari不会在服务器端的refresh/onbeforeunload上运行回调函数(调用客户端代码)

Javascript Safari不会在服务器端的refresh/onbeforeunload上运行回调函数(调用客户端代码),javascript,safari,server,client,onbeforeunload,Javascript,Safari,Server,Client,Onbeforeunload,我试图在卸载窗口时(即刷新页面时)向数据库发送一些请求。出于某种原因,只有在Safari上,客户端代码才会执行,但对服务器的请求永远不会通过。当我在调试器中手动单步执行代码时,服务器确实获得了请求并对其进行了良好的处理 有人知道为什么会这样吗 window.onbeforeunload=函数(){ 控制台日志(“卸载前内部打开”); var requestParam=new a.ListRequest(); requestParam.setAction('set_delete'); var c

我试图在卸载窗口时(即刷新页面时)向数据库发送一些请求。出于某种原因,只有在Safari上,客户端代码才会执行,但对服务器的请求永远不会通过。当我在调试器中手动单步执行代码时,服务器确实获得了请求并对其进行了良好的处理

有人知道为什么会这样吗

window.onbeforeunload=函数(){
控制台日志(“卸载前内部打开”);
var requestParam=new a.ListRequest();
requestParam.setAction('set_delete');
var callback=函数(issucess,response){
如果(isSuccess){
//做点什么
}否则{
//做点别的
}
};
//向服务器发送请求
a、 Fetch.list(requestParam,回调);

}
可能在Fetch调用中发生的请求是异步的,Safari在进入下一页/关闭选项卡之前没有等待它完成。如果您可以使调用同步,它应该可以工作。请记住,在某些工具中,同步调用通常是不受鼓励和反对的

这个与Jquery相关的答案很好地解释了同步调用:

您可以使用(FF、Chrome、Opera):

用户代理通常会忽略卸载处理程序中生成的异步
XMLHttpRequests
。为了解决此问题,分析和诊断代码通常会在
unload
beforeuload
处理程序中进行同步
XMLHttpRequest
,以提交数据。同步
XMLHttpRequest
强制用户代理延迟卸载文档,并使下一次导航看起来更慢。下一页无法避免这种页面加载性能差的感觉

使用
sendBeacon()
方法,当用户代理有机会这样做时,数据将异步传输到web服务器,而不会延迟卸载或影响下一次导航的性能。

您可以通过将async属性设置为false
async:false

window.onbeforeunload = function() {
    $.ajax({
        // Query to server
        async:false,
        method: "GET",
        url: "your.page",
        data: { param1 : "value1" }
    }).done(function(jqXHR, textStatus) {
        // Verify good data
        // Do stuff
        alert( "Request done: " + textStatus );
    }).fail(function( jqXHR, textStatus ) {
        alert( "Request failed: " + textStatus );
    });
}

正如@craigts所说,在返回ajax调用之前,浏览器已经不存在了。 你可能会在那页上多呆几秒钟

window.onbeforeunload = function(e) {
  return 'Dialog text here.';
};
但是,您的用户会发现这很烦人


第二个选项,查找另一个事件,而不是等待页面卸载。持续捕获您的数据。一旦改变就抓住它。用户是否将使用链接继续?如果是这样,您可以使用cancelEvent()劫持链接,然后在ajax返回后继续。

在没有看到您的代码的情况下,我只能猜测。。你的代码中有一个bug,但它可以在Chrome和Firefox上运行。我将添加一些示例代码,说明您向服务器发送了什么?还有,为什么要在重新加载之前发送此消息?我正在向服务器发送更新数据库的请求,我希望在页面卸载之前执行此操作。然后服务器返回一个响应,说明失败或成功。(这都是异步的)同步请求是邪恶的。永远不要阻止用户I/O。我想你应该提到“这是一项实验性技术”,我讨论了是否提供第二个选项这样的替代解决方案,因为这是我在我工作过的站点上解决这个问题的主要方法。
window.onbeforeunload = function(e) {
  return 'Dialog text here.';
};