javascript - beforeunload 中的 ajax 会可靠地执行吗?

标签 javascript ajax

我有一个 HTML5 应用程序,它需要在用户更改/刷新页面时发送断开连接的 ajax 请求。我目前正在使用此代码:

window.addEventListener("beforeunload", function(event) {
    $.ajax({
        url: api_disconnect,
        data: { identifier: token },
        method: "GET"
    });
});

我不需要处理响应,甚至不需要确保浏览器收到响应。我的问题是,我可以依赖接收请求的服务器吗?

如果没有,我怎样才能做到这一点?目前我让应用程序发送“我还活着!”每 15 秒请求一次(这已经感觉太多了)。我希望服务器知道用户断开连接的那一秒。

澄清一下,我知道如果浏览器/计算机崩溃,我对此无能为力。这就是心跳的用途。我只是指在正常用例中,当用户关闭/更改/刷新页面时。

最佳答案

您不能 100% 依赖 ajax 调用。您可以测试许多浏览器和操作系统,并确定哪些浏览器和操作系统通常会在页面被拆除之前发送 ajax 调用,但任何规范都不能保证这样做。

您使用的心跳是最常见的解决方法。这也将涵盖您因网络连接丢失或断电或计算机 sleep 模式或浏览器崩溃而 beforeunload 处理程序不会。

我看到讨论的另一种解决方法是使用 socket.io 连接到服务器。由于 socket.io 连接有一个小的、非常有效的心跳,并且服务器会在页面关闭时看到套接字关闭,所以你可以两全其美,因为你会通过心跳看到异常关闭您将看到通过关闭 webSocket 连接立即正常关闭。

关于javascript - beforeunload 中的 ajax 会可靠地执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30676368/

相关文章:

javascript - 通过将类名从一个元素传递到下一个元素,单击鼠标即可更改图像

javascript - 不使用数据注释的 ASP.NET MVC 验证?

javascript - jquery datetimepicker 设置为日期取决于日期

javascript - 如何在 JavaScript 中的类工厂中设置类名?

javascript - componentDidMount 和 XMLHttpRequest 加载数据两次但 JSON 无效

javascript - CKEditor 4.2.2 - allowedContent = true 不工作

php - setInterval 会使客户端 PC 过载吗?

javascript - 创建复选框数组并将其传递给 JavaScript 函数

javascript - keyup 13 事件重复隐含提交 - 输入问题时提交表单

javascript - 连续的 ajax 调用卡住 chrome 和 IE