js 在浏览器窗口关闭后还可以不中断网络请求

这篇具有很好参考价值的文章主要介绍了js 在浏览器窗口关闭后还可以不中断网络请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有个需求,我们需要在用户发送数据过程中,如果用户关闭了网页(包括整个浏览器关闭),不要中断数据传递

目前XMLHttpRequest对象是不支持的

http服务器

为了测试效果我们用nodejs写了个http服务器代码 文件名为httpServer.js如下,执行node httpServer.js就可以跑起来,支持get,post携带数据

// 导入http模块
const http = require('http');
var querystring = require('querystring');
// 创建Web服务器对象
const server = http.createServer();
// 监听端口号5005并启动HTTP服务器
server.listen(5005, () => {
    console.log('Web服务器启动成功啦!')
})

// 服务器实例通过.on()方法为服务器绑定request事件,监听客户端发来的请求,触发事件处理函数
server.on('request', (req, res) => {
    const version = req.httpVersion;
    const url = req.url;
    const method = req.method;
    console.log("收到请求:" + url + "method:" + method)
    res.setHeader('Content-Type', 'application/json');
    res.setHeader("Access-Control-Allow-Origin", '*')

    let info = { url: url, method: method }

    if (method.toLocaleLowerCase() == "post") {
        // 定义了一个post变量,用于暂存请求体的信息
        var post = '';

        // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
        req.on('data', function (chunk) {
            post += chunk;
        });

        // 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
        req.on('end', function () {
            post = JSON.parse(post);
            info.body = post;
            console.log("post", post)
            // 调用res.end()方法向客户端响应一些内容
            res.end(JSON.stringify(info));
        });
    }
    else {
        // 调用res.end()方法向客户端响应一些内容
        res.end(JSON.stringify(info));
    }




})

终端效果

如果服务器收到网络请求,你的cmd或终端会看到如下的信息

js 在浏览器窗口关闭后还可以不中断网络请求,代码片段,demo,javascript,前端,开发语言

我们写了三个网络请求函数

XMLHttpRequest请求

 function ajaxFn() {
            return new Promise((resolve, reject) => {
                var request = new XMLHttpRequest();

                request.open('get', request_url);
                request.send();
                request.onreadystatechange = function () {
                    if (request.readyState == 4) {
                        // console.log(request.responseText)
                        // console.log("ajax响应内容", request.responseText)
                        resolve(JSON.parse(request.responseText))
                    }
                }
                request.onerror = function (e) {
                    console.error("ajax跨域")
                    reject(2)
                }
            })
        }
调用方式
//XMLHttpRequest关闭窗口后不会发起网络请求
            ajaxFn().then(res=>{
                console.log("ajax响应内容",res)
            })

fetch请求 &&调用

//fetch 开启keepalive,可以发起网络请求,且不局限类型
            fetch(request_url, {
                method: 'post',
                keepalive: true,
                body: JSON.stringify({
                    'name': 'lili'
                })
            }).then(response => {
                response.json().then((data) => {
                    console.log("fetch响应内容",data);
                    return data;
                }).catch((err) => {
                    console.log(err);
                })
            })

 navigator.sendBeacon发送数据

  navigator.sendBeacon(request_url, JSON.stringify({ name: "sendBeacon" }), true);

为什么这里叫发送数据了,因为它不提供响应数据的回调函数,目标就是使用发送数据,只要服务器接口存在,关闭浏览器都不会影响继续发送数据

写个按钮,点击时候分不触发上面的函数,结果都可以发送数据

改为页面即将销毁时候触发上面函数

window.addEventListener('unload', function (event) {
            //触发函数
        });

结果XMLHttpRequest方式请求数据的方式,后台无法接受到数据

移动端兼容

unload事件在移动端上面不支持可以做以下判断

if (window.onunload) {
            window.addEventListener('unload', function (event) {
                //........
            });
        }
        else{
            document.addEventListener('visibilitychange', function logData() {
            if (document.visibilityState === 'hidden') {
                ///.....
            }
        });
 }

结论

使用navigator.sendBeacon场景:
  1. 传递少量数据
  2. 不考虑响应结果
  3. 只要求post请求方式
  4. 浏览器窗口关闭依旧发送数据
  5. 不会阻塞页面卸载,也就不会影响下一导航的载入
  6. 支持跨域(不关心数据响应,也没有跨域的顾虑,跨域是可以发送数据的,只是没法读取响应数据)
  7. 不支持自定义请求头
使用fetch keepalive
  1. 不考虑传递数据体积大小
  2. 大多数时候需要响应数据结果
  3. 任意请求方式
  4. 浏览器窗口关闭依旧发送数据&&不考虑响应结果
XMLHttpRequest
浏览器关闭后,不需要发送数据

参考

Navigator.sendBeacon() - Web API 接口参考 | MDN

Navigator sendBeacon页面关闭也能发送请求方法示例_javascript技巧_脚本之家文章来源地址https://www.toymoban.com/news/detail-611033.html

到了这里,关于js 在浏览器窗口关闭后还可以不中断网络请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS监听浏览器关闭、刷新及切换标签页触发事件

    蛮简单的东西,知道就会,不知道就不会,没什么逻辑可言。简单记录一下,只为加深点儿印象。 visibilitychange visibilitychange可以监听到浏览器的切换标签页。  直接上代码:  beforeunload  beforeunload可以监听到页面的关闭,页签切换不会触发 关闭浏览器窗口的时候触发 通过点

    2024年02月08日
    浏览(53)
  • js获取元素到可视区的距离/浏览器窗口滚动距离/元素距离浏览器顶部距离

    1. js获取元素距离可视区的各种距离 2. js获取浏览器窗口滚动距离 3. js获取元素实际距离页面距离(包括滚动距离) (1).如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离。 (2).如果父辈元素中没有定位元素,那么就返回相对于body边缘距

    2024年02月12日
    浏览(51)
  • windows系统edge浏览器退出账户后还能免密登录的解决方式

    edge浏览器明明退出登录了,还能不用输密码一键点击就能登录; 这是因为微软的煞笔产品经理用脚后跟想出来的方案。 解决方案: 去设置里的账号管理,注销自己的微软账号登录; 如果你发现自己并没有登录,那么看下是否绑定了电子邮件,删除即可 最后再说一句,煞笔

    2024年02月09日
    浏览(103)
  • 【CSS 08】display 控制布局 块级元素 行内元素 隐藏元素 结合JS 最大宽度 浏览器窗口 定位 position z-index 堆叠

    说在前面 CSS基础教程系列已经结束,接下来就是中级教程,让我们跟上脚步,继续努力吧! 并且最近临近期末考试,后面十天休刊… display display 属性是用于控制布局的最重要的 CSS 属性 display 属性规定是否/如何显示元素 隐藏元素 - display:none 还是 visibility:hidden 通过将 disp

    2024年02月08日
    浏览(58)
  • python用selenium打开浏览器后秒关闭浏览器-解决方法

    学习selenium的时候,上手第一个脚本发现成功打开浏览器后,代码执行完毕浏览器又秒关闭了,代码如下: 1、检查代码,代码中没有写driver.quit()或driver.close()方法,也没有其它错误提示; 2、检查版本号,浏览器版本号,驱动版本号,确认版本号没有问题; 3、最后找到解决

    2024年02月11日
    浏览(80)
  • edge浏览器关闭组织托管

    参考链接   edge浏览器出现了“由你的组织管理”的提示,另外的一个的解决方案!_哔哩哔哩_bilibili 我本人是直接删除注册表 计算机HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftEdge  解决了问题 如果怕删除注册表有什么隐患,可以在注册表编辑器中在需要备份的文件目录下店家左

    2024年02月20日
    浏览(45)
  • 让selenium不自动关闭浏览器

    话不多说直接上代码 运行代码 完成!!! selenium的基本使用: 点击这里

    2024年02月11日
    浏览(50)
  • 解决Selenium自动关闭浏览器问题

    在没有使用close或者quit的情况下,Selenium自动关闭浏览器就是因为Selenium运行结束了。分两种情况: 在命令行运行时,或在打包好的程序里运行时会有这种情况;在使用Pycharm之类IDE运行代码的时候通常不会造成浏览器关闭,但也有可能在某些IDE里面出现。网上有建议使用“

    2024年02月11日
    浏览(53)
  • mac-关闭谷歌浏览器更新

    终端中输入命令: 上面的目录如果不存在,执行下面的 终端中输入命令: // 修改文件夹GoogleSoftwareUpdate的拥有者,阻止谷歌对其的写入权限 需要禁止浏览器自动升级,不然总是要更新自动化驱动。 然后不用了我又想恢复更新升级总是失败。 记录下恢复操作恢复谷歌浏览器

    2024年02月16日
    浏览(48)
  • Chrome浏览器关闭页面底部的下载栏

    访问chrome://settings/help,浏览器将自动更新到v101版本,更新完成后重启即可。 访问chrome://flags/#download-bubble,将默认的Default改为Enabled,然后按提示重启浏览器。 接下来,当你开始进行下载任务时,Chrome底部的下载栏将不会再出现。 取而代之的是右上角的下载管理按钮。点击

    2024年02月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包