5.XMLHttpRequest对象

news2025/8/9 21:00:49

XMLHttpRequest简称xhr,是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax,现在我们使用原生JS的Ajax

目录

1  GET请求

1.1  不带参数请求

1.2  带参数请求

2  URL的编码与解码

2.1  编码 encodeURI()

2.2  解码 decodeURI()

3  POST请求

4  模拟jQuery中的Ajax函数

5  XMLHttpRequest Level2

5.1  设置HTTP的请求时限

5.2  Formdata对象

5.2.1  简单使用

5.2.2  Formdata直接获取表单数据

5.2.3  上传文件

5.2.4  上传文件的进度


1  GET请求

1.1  不带参数请求

先看服务

前端请求

  • xhr.open()中可以写大写的GET,也可以写小写的GET
  • xhr.readyState与xhr.status写死就行,如果请求成功就需要这两个条件

xhr.readyState代表请求的状态,4代表请求已经完成了,除了4之外还有下面这几种状态

1.2  带参数请求

先看服务,当你传入data1和data2后,服务会将两个值变成整数然后加和,之后返回给你

 

get请求直接将要传递的东西放在查询字符串中就可以了,无论什么框架带参数的get请求数据实质上都是以查询字符串的形式传递的

2  URL的编码与解码

url地址中只允许出现字母,标点符号,数字,想是中文这种字符会被自动编码

比如说你在百度上搜索 我 这个汉字,实质上就会编码为%E6%88%91,一般来讲一个汉字就对应着三个百分号值

2.1  编码 encodeURI()

2.2  解码 decodeURI()

3  POST请求

服务

请求

post请求需要使用setRequestHeader()设置请求头,这个是固定写法,setRequestHeader()必须放在open()的后面,send()的前面

post要发送的数据要写在send()中

4  模拟jQuery中的Ajax函数

我们只考虑get与post的情况,需要处理的地方就是将传入的data对象转变为查询字符串的形式,判断是get还是post,除此之外简单弄一弄就行了

<!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>
</head>
<body>
    
</body>
<script>
    function myAjax(resquest_obj) {
        xhr = new XMLHttpRequest()

        if (/^GET$/i.test(resquest_obj.type)) {
            send_str = ''
            for (i in resquest_obj.data) {
                send_str = send_str + i + '=' + resquest_obj.data[i] + '&'
            }
            send_str = send_str.slice(0,-1)
            
            resquest_obj.url = resquest_obj.url + '?' + send_str
            
            xhr.open(resquest_obj.type,resquest_obj.url)

            xhr.send()

            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    resquest_obj.success(xhr.responseText)
                }
            }
        }

        else if (/^POST$/i.test(resquest_obj.type)) {
            xhr.open(resquest_obj.type,resquest_obj.url)

            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')

            send_str = ''
            for (i in resquest_obj.data) {
                send_str = send_str + i + '=' + resquest_obj.data[i] + '&'
            }
            send_str = send_str.slice(0,-1)
            xhr.send(send_str)

            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    resquest_obj.success(xhr.responseText)
                }
            }
        }
    }
</script>
</html>

搞一个服务测一下,get是两个数相加,post是两个数相乘

get

post

5  XMLHttpRequest Level2

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

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

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

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

5.1  设置HTTP的请求时限

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

  • 单位为毫秒

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

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

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

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

5.2  Formdata对象

5.2.1  简单使用

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

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

5.2.2  Formdata直接获取表单数据

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

点击提交后得到结果

5.2.3  上传文件

后端

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

前端

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

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

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

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

打开后选择AJAX.jpg

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

5.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 中文网

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

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

相关文章

计算机网络——TCP连接管理

本文将会介绍如何建立和拆除一条TCP连接&#xff0c;TCP的连接会显著的增加人们感受到的时延&#xff08;尤其是在Web冲浪时&#xff09;。同时一些常见的网络攻击SYN洪范攻击利用了TCP连接管理的弱点。 假定运行一台主机&#xff08;客户&#xff09;上的一个进程想和另一台主…

Spring中各种注解的使用说明汇总清单

目录 一、放在最开始方法的外侧的注解 1、ControllerAdvice&#xff1a; 2、ResponseBody 3、slf4j 4、Configuration 5、Component 6、Mapper 7、Service 8、RestController RequestMapping("/路径") 9、EnableTransactionManagement和Transactional&…

maven学习:maven安装、maven仓库、Idea配置maven

一、maven安装 1.1 下载maven Maven的版本对应的jdk和发布日期:Maven – Maven Releases History 到官方网站下载maven,网站: Maven – Download Apache Maven 如下图: 下载maven之前的版本:Index of /dist/maven/maven-3 注意&#xff1a; idea与maven的版本需要兼容, 所以我…

Python学的好,工作不愁找

俗话说的好&#xff1a;“Python学的好&#xff0c;工作不愁找”&#xff0c;不管我们学习哪一门语言&#xff0c;我们都要掌握从抽象化中提取出来的方法&#xff0c;这样你才能提高我们的学习能力&#xff0c;并且在学习新事物的时候可以提取我们自己的想法。学习Python&#…

基于SpringBoot的仿小米商城系统

仿小米商城分为前后台&#xff0c;分为用户和管理员两种角色&#xff0c;管理员可以登录后台管理系统~ 可以作为毕设~也可以作为学习的项目~ 前台部分运行截图如下所示 后台部分运行截图如下所示 拒绝白嫖&#xff01;20分享源码&#xff01;want to get it 私 me&#xf…

Java入门简单小游戏有哪些?

适合新手练习的小游戏有超级玛丽、愤怒的小鸟、飞机大战、五子棋、彩虹雨、聊天室、华容道、坦克大战、扫雷等。还有贪吃蛇&#xff0c;由Java开发出来的一款经典小游戏&#xff0c;java小白入门可以用这款游戏开发练手锻炼自己的编程能力。 教程推荐&#xff1a;玩会Java&…

【Linux】(六)MobaXterm文件传输与终端-实验室服务器使用MobaXterm传输文件和ssh终端连接

MobaXterm系列文章文件传输或远程终端&#xff08;MobaXterm&#xff09;系列文章 &#xff08;一&#xff09;服务器初次配置及安装vncserver &#xff08;二&#xff09;实验室添加新用户及其配置vnc4server、xfce4桌面访问流程 &#xff08;三&#xff09;VNC桌面连接开发方…

C++初阶(stack+queue)

stack是一种容器适配器&#xff0c;专门用在具有后进先出 (last-in first-out)操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组…

Unity RectTransform 组件

文章目录1.RectTransform 介绍2.Anchor 锚点3.Pivot 轴心点4.RectTransform API 属性4.1 anchorMax、anchorMin —— 锚点矩形4.2 offsetMax、offsetMin —— 偏移量4.3 rect —— 矩形类4.4 sizeDelta —— UI坐标4.5 anchoredPosition —— UI坐标5.RectTransform API 方法5.…

数据可视化 | Tableau从入门到高手 入门联接关系数据预处理

Tableau 人人可用、处处可用的分析 Tableau 是一个可视化分析平台&#xff0c;它改变了我们使用数据解决问题的方式&#xff0c;使个人和组织能够充分利用自己的数据。利用 Tableau 查看并理解任何数据。 Tableau Software 可以帮助人们查看并理解数据&#xff0c;可连接到几乎…

蓝桥杯实战应用【算法代码篇】-基于数组实现线性表

前言 线性表是由有限个具有相同性质的元素构成,结构上要求,非表头和表尾元素有且只有一个前驱和后继。对于表头和表尾元素,如果是没有环的线性表,则表头元素没有前驱,表尾元素没有后继。如果有环则均存在前驱和后继元素。对于线性结构,有两种保存的方法,一种是使用C语言…

Spring Boot Admin -Actuator 图形化管理工具

Spring Boot Admin 概述 之前学习了Spring Boot Actuator的特性&#xff0c;它能够是开发者很便捷的监控系统的各种指标&#xff0c;但是有一个很大的问题 — 不够直观。今天来学习下Spring Boot Admin。Spring Boot Admin 是一个免费的开源社区项目&#xff0c;用于监控、管…

Java多线程:从基本概念到避坑指南

本文为掘金社区首发签约文章&#xff0c;未获授权禁止转载 多核的机器&#xff0c;现在已经非常常见了。即使是一块手机&#xff0c;也都配备了强劲的多核处理器。通过多进程和多线程的手段&#xff0c;就可以让多个CPU同时工作&#xff0c;来加快任务的执行。 多线程&#xf…

户外运动耳机推荐、这几款耳机专为户外运动而生

随着夏日的艳阳离去&#xff0c;秋意渐浓。在这个最适合郊外野游&#xff0c;最适合户外运动的季节&#xff0c;我们当然不能继续做我们的宅男宅女&#xff0c;而应该放任自己到野地里去撒一回野。当然&#xff0c;对于没有数码产品一天都不能活的你来说&#xff0c;即使行走在…

debug(二)(还没完)

视频来源&#xff1a;尚硅谷_宋红康_IDEA2022版本的安装与使用 【【尚硅谷】IDEA2022全新版教程&#xff0c;兼容JDK17&#xff08;快速上手Java开发利器&#xff09;】 https://www.bilibili.com/video/BV1CK411d7aA?p16&vd_source581d732b20cb23e01428068f153a99ed I…

Spring Security(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 经常上网的人都应该有这样的体验&#xff1a;很多网站或者APP只需要第一次登录时输入用户名和密码之后&#xff0c;后面很长一段时间内就不需要再次输入密码了。…

48种数据分析可视化图表

可视化对于数据分析师来说可能不是最重要的&#xff0c;重要的是你分析或挖掘出来的结果是否有效。在这基础之上就需要通过可视化恰当完整的表达见解。这里又有区别了&#xff1a;实用性和美观性哪个更重要&#xff1f;要我说实用性是第一位的&#xff0c;能用一个元素表达最好…

python中的GUI自动化工具介绍

目录 1.pyautoGui 2.Lackey 3.AXUI 4.winGuiAuto 5.pywinauto 6.总结 1.pyautoGui PyAutoGUI是一个纯Python的GUI自动化工具&#xff0c;通过它可以让程序自动控制鼠标和键盘的一系列操作来达到自动化测试的目的。PyAutoGui 也一个流行的跨平台库&#xff08;具有基于图…

Day5:写前端项目(html+css+js)-导航部分p1

目录 实现折叠按钮 medium screen size 实现折叠按钮 效果图&#xff1a; 如何在调整屏幕尺寸大小的时候&#xff0c;导航栏的列表会从横的变成三条杠杠。就像手风琴导航栏 手风琴button的操作 aria-expanded - Accessibility | MDN <button class"mobile-nav-tog…

【opencv】形态学重建案例-数糖果(细胞)个数

原始图片如下&#xff0c;要求是利用形态学重建方法数出糖果个数 step1&#xff1a;先进行测地膨胀 令F表示标记图像&#xff0c;令G表示模板图像。在讨论中&#xff0c;我们假设两幅图像都是二值图像&#xff0c;且F包含于G。标记图像相对于模板大小为1的测地膨胀定义为 F相对…