在窗口关闭上运行Ajax请求

时间:2016-07-10 04:16:50

标签: javascript jquery ajax

如果窗口关闭,我正在尝试提交一些表单数据,但我甚至无法在测试时获取警报。我确实读过我可能需要一个服务器端替代方案吗?

这就是我所拥有的:

//if window is closed send form data anyway
$(window).on('beforeunload', function() {
    $.ajax({
            type: 'POST',
            url: $(actualForm).attr('action'),
            data: formData,
            async: false
    });
    alert('something');
});

我做错了什么,或者这不是一个可行的解决方案?

1 个答案:

答案 0 :(得分:5)

这不会可靠地运作。您无法在卸载时触发网络请求,并希望在页面上下文被拆除之前完成。如果您要发送数据,则应在未与此表单进行交互时发送。 (检查焦点离开输入时的onblur事件。)

一般来说,如果你需要知道有人关闭页面,有一些狡猾的选择,每个都有自己的警告。

一种经典方法是长轮询资源。基本上,您将服务器装配为接受连接并发送标头,但不发送实际数据。资源可以是任何东西......图像,js,媒体,无所谓。这里的想法是,当页面上下文被销毁时,浏览器将取消任何正在进行的HTTP请求。删除连接后,浏览器可能已关闭。这种方法存在实际问题。你和浏览器之间的代理服务器将做不可预测的事情,提前终止连接,让它们无限期地打开等等。另一个问题是你必须记住,使用HTTP / 1.1和HTTP / 2,许多请求可以在同一个连接下发送。用户可以关闭页面,但底层TCP连接可能保持活动状态。

Web套接字可以用作现代替代方案。您可以合理地确定,如果您创建了一个Web套接字连接,并且它已关闭,那么页面就会消失,或者浏览器已经失去了连接。与长轮询一样,您需要构建一个服务器来支持此功能。还要注意一些移动网络真的搞乱了网络套接字。 (谢谢你,Sprint。)虽然这种情况越来越好,因为此时浏览器已经支持多年的网络套接字。

你也可以进行重复的AJAX调查。每隔5秒左右,客户端发送一条请求,说“我还在这里!”,服务器更新其数据库,表明如此。如果15秒后你没有从浏览器中听到,它可能已经不再打开了。再一次,这并不能保证这一点......连接可能只是暂时失去了。这种方法的缺点是每个请求都有开销。当浏览器关闭时,检测的延迟也很高,因为您必须设置相当高的轮询间隔。 (我不会少于5秒。你不知道什么样的客户端资源问题可能会减慢浏览器请求。曾经见过任何使用卫星互联网的人吗?)

总之,最好不要这样做。如果可能的话,尽早保存来解决问题。