如何在web页面关闭或刷新之前,发送Ajax到服务端

栏目: jQuery · 发布时间: 5年前

内容简介:最近在做实时视频这块的封装,需要客户端Ajax实时上报状态给服务端,以确认用户的当前的通话状态。这个时候,涉及到当用户离开客户端时候(关闭浏览器),发送离线状态给服务器。浏览器关闭事件会有两个,1、

最近在做实时视频这块的封装,需要客户端Ajax实时上报状态给服务端,以确认用户的当前的通话状态。这个时候,涉及到当用户离开客户端时候(关闭浏览器),发送离线状态给服务器。

一、监听浏览器关闭事件

浏览器关闭事件会有两个, unload 和 **beforunload,两者是有区别的,从字面上来看, beforunload 的调用是在 unload 之前。

1、 beforeunload 在用户即将离开页面时触发,它返回一个字符串,浏览器会向用户展示并询问这个字符串以确定是否离开。

2、 unload 在用户已经离开时触发,我们在这个阶段仅可以做一些没有延迟的操作,由于种种限制,很少被使用。

3、需要注意的是,如果在两个事件监听中添加 alert、confirm、prompt会忽略

4、生效情况:

  • 1·关闭浏览器窗口
  • 2·通过地址栏或收藏夹前往其他页面的时候
  • 3·点击返回,前进,刷新,主页其中一个的时候
  • 4·点击 一个前往其他页面的url连接的时候
  • 5·调用以下任意一个事件的时候:click,document.write()方法(输出内容),document.open() 打开一个新的空白文档,document.close()方法可关闭一个由open()方法打开的输出流,并显示选定的数据。 ,window close (),form.submit.
  • 6·当用window open打开一个页面,并把本页的window的名字传给要打开的页面的时候。
  • 7·重新赋予location.href的值的时候。
  • 8·通过input type=”submit”按钮提交一个具有指定action的表单的时候。
  • 9.可以用在以下元素:body, frameset, window

==上代码==

window.onunload = function(){
	// 相关代码
}
window.onbeforeunload = function(){
    // 相关代码
}
window.addEventListener('unload', ()=>{
    // 相关代码
});
window.addEventListener('beforeunload', ()=>{
    // 相关代码
});
复制代码

有时候两个监听需要配合使用,当然,避免重复调用,要做一些处理。

二、发送请求

有了上面两个监听为前提下,我们来关心一下怎么能把请求发送成功给服务端。如果只是在监听中随便写个请求,说不定请求还没发出去,已经被浏览器停止了,异步的Ajax不一定能准确的到达服务端。下面有三个想法可以进行实现。

1、请求设置为同步(不建议)

大家第一反应可能是,把请求设置为同步请求,上代码:

var xml = new XMLHttpRequest();

xml.open('POST', url , false); // false表示不是异步请求

xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xml.onreadystatechange = function() {
    if (xml.readyState == 4 && xml.status == 200) {
        var responeData = xml.responseText;
        var data = JSON.parse(responeData);
    } else {
        // 处理异常
    }
};

xml.send('account=1&password=123456');

复制代码

这种方法可以实现,但是对用户体验会有比较大的影响,并且在http协议最新的提案中,有考虑剔除请求同步标准

2、使用navigator中的sendBeacon发送异步请求(建议)

相关使用方法

body = JSON.stringify(body);
// 原来是 xhr.send(body)变为
navigator.sendBeacon(url,body);

复制代码

支持发送的body可以是ArrayBufferView, Blob, DOMString, 或者 FormData 类型的数据。 根据MDN的介绍:

主要用于满足 统计和诊断代码的需要,这些代码通常尝试在卸载(unload)文档之前向web服务器发送数据。过早的发送数据可能导致错过收集数据的机会。然而, 对于开发者来说保证在文档卸载期间发送数据一直是一个困难。因为用户代理通常会忽略在卸载事件处理器中产生的异步 XMLHttpRequest 。

复制代码

下面介绍一下两种其他不同类型的发送方式

  • (1) body使用Blob对象,有个好处是,可以自定义的设置header
blob = new Blob([`accoutn=12332323`], {type : 'application/x-www-form-urlencoded'});
navigator.sendBeacon("/leave", blob);

复制代码
  • (2) 使用FormData对象,但是这时content-type会被自动变成"multipart/form-data"
var fd = new FormData();
fd.append('account', 123);
navigator.sendBeacon("/leave", fd);
复制代码

以上所述就是小编给大家介绍的《如何在web页面关闭或刷新之前,发送Ajax到服务端》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人人都是产品经理2.0

人人都是产品经理2.0

苏杰 / 电子工业出版社 / 2017-5 / 66.6

《人人都是产品经理2.0——写给泛产品经理》继续定位在-1~3 岁的产品经理。这里特别要强调,“-1 岁”指的是“泛产品经理”群体,比如自认为是“产品新人”的“职场老人”,需要自己做产品的早期创业者,对产品感兴趣并且工作中可能要承担部分职责的技术、设计、运营等人员,其他行业对互联网产品感兴趣的从业者等,《人人都是产品经理2.0——写给泛产品经理》可以说是为他们量身定做的。 内容方面,《人人都......一起来看看 《人人都是产品经理2.0》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码