11.XMLHttpRequest的进阶用法

news2024/11/25 12:43:28

目录

1  设置HTTP的请求时限

2  Formdata对象

2.1  简单使用

2.2  Formdata直接获取表单数据

2.3  上传文件

2.4  上传文件的进度

3  定义API根路径

4  请求出错


上面我们用的都是旧版的XMLHttpRequest,旧版有两个缺点

  • 无法上传文件
  • 没有传送数据的进度信息

XMLHttpRequest Level2 是 XMLHttpRequest 的升级版(随着HTML5一起更新,在2014年10月28日完成更新,如果浏览器支持HTML5大概率也支持XMLHttpRequest的Level2),继承了老版本的所有用法且使用方式相同,有下面这些新的功能

  • 设置HTTP请求的时限
  • 使用FormData对象管理表单数据
  • 可以上传文件
  • 可以获得数据传输的进度信息

1  设置HTTP的请求时限

请求时限的属性名称是timeout,过了这个时间还没有请求完毕就中断这次请求

  • 单位为毫秒

可以配套使用timeout事件,可以设置中止之后干一点儿什么

我们给一个极短的时间测试一下,比如给3ms

3ms内没有完成请求,请求就中断了自然也没有之后的响应结果。中断后触发了timeout事件,执行了timeout中的函数

在服务端虽然请求中断了,但状态码依然是200

2  Formdata对象

2.1  简单使用

Formdata对象可以更便捷的传输数据,我们简单用一下

上面这个例子中,如果使用FormData发送就不要再使用setRequestHeader()加请求头了,不然会报错

2.2  Formdata直接获取表单数据

  • e.preventDefault()是取消默认提交行为

点击提交后得到结果

2.3  上传文件

后端

上传后会保存在代码同级目录下的upload_file,目前我还没上传,文件夹是空的

前端

使用input.files就可以接到选择的文件,files是一个数组一会儿我们打印出来看一下

如果数组元素<=0就是没选择文件,会提示你选择要上传的文件并中止函数

使用files[0]拿到文件加入的FormData对象中

之后直接把FormData对象传上去就行

打开后选择AJAX.jpg

上传之后在文件夹中得到了这张图

2.4  上传文件的进度

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        section {
            width:300px;
            height:20px;
            padding:2px;
            margin-top:20px;
            border:3px solid red;
        }
        div {
            width:0px;
            height:100%;
            background-color: red;
        }
    </style>
</head>
<body>
    <input type="file">
    <button>上传文件</button>

    <section>
        <div></div>
    </section>
    <span>0%</span>
</body>
<script>
    btn = document.querySelector('button')
    input = document.querySelector('input')
    div = document.querySelector('div')
    span = document.querySelector('span')
    
    btn.addEventListener('click',function() {
        files = input.files
        console.log(files)
        if (files.length <= 0) {
            return alert('请选择要上传的文件')
        }

        FormData_obj = new FormData()
        FormData_obj.append('file',files[0])

        xhr = new XMLHttpRequest()

        xhr.upload.onprogress = function(e) {
            if (e.lengthComputable) {
                percentComplate = (e.loaded/e.total)*100 - 1

                span.innerHTML = percentComplate + '%'
                div.style.width = percentComplate + '%'
            }
        }

        xhr.open('POST','http://127.0.0.1:5000/upload')
        xhr.send(FormData_obj)

        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText)

                span.innerHTML = '100%'
                div.style.width = '100%'
            }
        }
    })
</script>
</html>

xhr.upload.onprogress的书写位置在创建xhr对象后,xhr.open()前

使用xhr.upload.onprogress事件获取文件的上传进度,该事件的事件对象中我们用到三个属性

  • e.lengthComputable 这个值是一个布尔值,如果长度可以计算就返回true,不可计算就返回false
  • e.loaded 加载的字节大小
  • e.total 文件的总字节大小

我们上传一个看一下,我这里有一个较大的数据集

点击上传文件时进度条会涨,底下的数值也会涨

直到最后100%

这里我将上传进度-1,因为在我的后端上传后还有保存,在其他的后端中上传后肯定也会有其他的操作,所以我等上传有响应后再将其置为100%,这样看起来比较舒服

bootstrap中有样式还不错的进度条,开发的时候可以使用一下 进度条(Progress) · Bootstrap v5 中文文档 v5.1 | Bootstrap 中文网

3  定义API根路径

如果仅仅是根路径的问题,我比较喜欢定义一个全局变量,然后每一次请求的时候都去拼接一下

4  请求出错

像是跨域或断网这种问题都会出现请求出错的问题,我们可以使用xhr.onerror()来捕获错误

比如在我们验证token的时候,当token不对的时候就会出现跨域问题,我们可以使用xhr.onerror()来处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署ddns-go,动态域名解析公网IPv6地址

Docker部署ddns-go&#xff0c;动态域名解析公网IPv6地址 ddns-go&#xff0c;自动获得你的公网 IPv4 或 IPv6 地址&#xff0c;并解析到对应的域名服务。 嫌IPv6地址太难记&#xff1f;ddns来解决&#xff0c;将家里的公网IPv6地址用起来吧&#xff01; 前言 为什么需要DDNS …

Java设计模式——装饰器模式

目录 1.什么是装饰器模式 2.装饰器模式优缺点 3.装饰器模式结构 4.代码示例 1.什么是装饰器模式 装饰器模式&#xff0c;指在不改变原有对象结构的基础情况下&#xff0c;动态地给该对象增加一些额外功能的职责。装饰器模式相比生成子类更加灵活。它属于对象结构型模式。 …

DCGAN

DCGAN的论文地址[https://arxiv.org/pdf/1511.06434.pdf]。DCGAN是GAN的一个变体&#xff0c;DCGAN就是将CNN和原始的GAN结合到一起&#xff0c;生成网络和鉴别网络都运用到了深度卷积神经网络。DCGAN提高了基础GAN的稳定性和生成结果质量。DCGAN主要是在网络架构上改进了原始的…

JVET-AC0315:用于色度帧内预测的跨分量Merge模式

ECM采用了许多跨分量的预测&#xff08;Cross-componentprediction&#xff0c;CCP&#xff09;模式&#xff0c;包括跨分量包括跨分量线性模型&#xff08;CCLM&#xff09;、卷积跨分量模型&#xff08;CCCM&#xff09;和梯度线性模型&#xff08;GLM&#xff09;&#xff0…

软件太多?1 秒找到您想要的应用

您的手机页面是怎样的呢&#xff1f; 也许像这样&#xff0c;所有 APP 平铺在一起~ 亦或是这样&#xff0c;将所有 APP 分类整理好~ 在整理的过程中&#xff0c;我们免不了要进行 “拖拽” 。 平铺式的呈现方式&#xff0c;如果 APP 数量众多&#xff0c;我们免不了要进行搜索…

基于Java的题库管理系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着我国社会的进步&#xff0c;社会的各个领域的创新改革都在高速发展的信息时代下突显出来。在信息时代这个大的背景下&#xff0c;对软件开发的要求越来越高&#xff0c;对考试的管理更需要加强&#xff0c;所以迫使我们不得不对…

【设计模式之美 设计原则与思想:面向对象】12丨实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?

上一节课&#xff0c;我们做了一些理论知识的铺垫性讲解&#xff0c;讲到了两种开发模式&#xff0c;基于贫血模型的传统开发模式&#xff0c;以及基于充血模型的 DDD 开发模式。今天&#xff0c;我们正式进入实战环节&#xff0c;看如何分别用这两种开发模式&#xff0c;设计实…

疫情开发,软件测试行情趋势是怎么样的?

如果说&#xff0c;2022年对于全世界来说&#xff0c;都是一场极大的挑战的话&#xff1b;那么&#xff0c;2023年绝对是机遇多多的一年。众所周知&#xff0c;随着疫情在全球范围内逐步得到控制&#xff0c;无论是国际还是国内的环境&#xff0c;都会呈现逐步回升的趋势&#…

每天一个摸鱼小技巧之「理解代码评审」

每个人的代码风格不同&#xff0c;在需要团队协作的项目里&#xff0c;如果没有统一的编程规范&#xff0c;那么会出现各式各样的代码&#xff0c;这对于团队成员来讲是个「灾难」。在需要对接协作模块时&#xff0c;要花费大量的时间去阅读代码&#xff0c;如果注释写的不明确…

观点分享 | 冲量在线联合创始人CTO陈浩栋:基于可信执行环境构建更安全的数据流通方案

2022年12月28日&#xff0c;由中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;、中国通信标准化协会指导&#xff0c;隐私计算联盟、中国通信标准化协会大数据技术标准推进委员会联合主办的2022可信隐私计算峰会在北京召开&#xff0c;本次峰会的主题为“推进隐…

IO多路转接 —— poll和epoll

文章目录1. poll1.1 poll的函数接口1.2 poll的简单测试程序1.3 poll的优缺点分析2. epoll2.1 epoll的函数接口2.2 epoll的工作原理2.3 epoll的工作模式(LT,ET)2.4 epoll的简易服务器实现(默认是LT工作模式)前言&#xff1a; 接上文讲述的select&#xff0c;它有缺点&#xff0c…

一个UML的例子

一、需求分析 1.概念定义 需求分析&#xff0c;要明确以下4个概念的具体内容&#xff1a; 资源是指使用或产生的对象&#xff0c;如人、物料、信息、产品等。 目标是指希望资源处于什么样的状态。 过程是指被执行的活动&#xff0c;这些活动会改变资源的状态。 规则是指在某些…

2023-02-09 - 3 Elasticsearch基础操作

本章主要介绍ES的基础操作&#xff0c;具体包括索引、映射和文档的相关操作。其中&#xff0c;在文档操作中将分别介绍单条操作和批量操作。在生产实践中经常会通过程序对文档进行操作&#xff0c;因此在介绍文档操作时会分别介绍DSL请求形式和Java的高级REST编码形式。 1 索引…

VIF原理

文章目录一、VIF公式和原理对于R方一般回归模型皮尔逊相关系数中的方差VIF原理&#xff1a;一、VIF公式和原理 所谓VIF方法&#xff0c;计算难度并不高。在线性回归方法里&#xff0c;应用最广泛的就是最小二乘法&#xff08;OLS&#xff09;&#xff0c;只不过我们对每个因子…

锁的优化机制了解嘛?请进!

点个关注&#xff0c;必回关 文章目录自旋锁&#xff1a;自适应锁&#xff1a;锁消除&#xff1a;锁粗化&#xff1a;偏向锁&#xff1a;轻量级锁&#xff1a;从JDK1.6版本之后&#xff0c;synchronized本身也在不断优化锁的机制&#xff0c;有些情况下他并不会是一个很重量级的…

Open AI登录,可以使用ChatGPT!

目录 第一步&#xff1a;准备好上网工具 1、确认自己的IP 二、登录 三、无法登录的问题 第一步&#xff1a;准备好上网工具 1、确认自己的IP 先查看自己的电脑的IP&#xff0c;使用https://www.ip138.com/,看看&#xff0c;然后就可以将自己电脑的IP改成国外的IP&#x…

Word处理控件Aspose.Words功能演示:使用 C++ 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…

利用 ChatGPT 回答 R 相关问题

最近小编也尝试使用了 ChatGPT&#xff0c;下面给出一些知乎上常见 R 语言相关问题的回答。供大家参考&#xff1a; 目录 文章目录目录经典问题预测数据科学软件排名数据科学的 10 个常用 R 包R 语言入门书籍和网站推荐回答专业问题绘图绘制正负柱状图动态散点图构建 Shiny 程…

Java学习笔记-03(API阶段)

前言 目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ API API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预…

如何使用HTTP远程连接DOCKER?

/etc/systemd/system/docker.service.d/override.conf 写入文件 ##Add this to the file for the docker daemon to use different ExecStart parameters (more things can be added here) [Service] ExecStart ExecStart/usr/bin/dockerd默认情况下使用 systemd 时&#xff0…