Ajax中XMLHttpRequest对象的详细解析

xhr.open(‘get’,‘/server’,true);

xhr.onreadystatechange=function(){

if(xhr.readyState!==4){

return

}

if(xhr.status>=200&&xhr.status<300){

console.log(xhr.responseText)

}

}

xhr.send(null)

3.timeout属性与ontimeout事件
  • timeout属性表示请求在等待响应多少毫秒轴终止,如果在规定时间内没有接收到响应,那么就会触发ontimeout事件处理程序

const xhr=new XMLHttpRequest()

xhr.open(‘get’,‘/server’,true);

//将超市设置为3秒钟

xhr.timeout=3000;

//请求超时后请求会自动终止,会调用ontimeout事件处理程序

xhr.ontimeout=function(){

//处理代码

console.log(‘请求超时了’)

}

xhr.send(null);

4.overrideMimeType()方法
  • overrideMimeType()方法能够重写服务器返回的MIME类型,从而让浏览器进行不一样的处理。

  • 假如服务器返回的数据类型是text/xml,由于种种原因浏览器解析不成功报错,这时就拿不到数据。为了拿到原始数据,我们可以把MIME类型改成text/plain,这样浏览器就不会去自动解析,从而我们就可以拿到原始文本了。

const xhr = new XMLHttpRequest()

xhr.open(‘get’, ‘/server’, true)

xhr.overrideMimeType(‘text/plain’)

xhr.send(null)

5.responseType属性
  • responseType属性是一个字符串,表示服务器返回数据的类型。使用xhr.response属性来接收

  • 这个属性时可写的,可以在调用open()方法之后,send()方法之间设置这个属性值,告诉服务器返回指定类型的数据,如果responseType设为哦空字符串,等同于默认值text。

  • responseTye属性可以设置格式类型如下

| responseType属性的值 | response属性的数据类型与说明 |

| — | — |

| ”“ | String字符串 默认值,等同于text |

| ”text“ | String字符串 服务器返回文本数据 |

| ”document“ | Document对象 希望返回XML格式数据时使用 |

| ”json“ | javascript对象 IE10/IE11不支持 |

| ”blob“ | Blob对象 服务器返回二进制对象 |

| ”arrayBuffer | ArrayBuffer随心 服务器返沪二进制数组 |

  • 当将reaponseType设置了一个特定类型时,你需要确保服务器返回的类型和你所设置的返回值类型时兼容的。如果两者类型不兼容,那么服务器返回的数据会变成null,及时服务器返回了数据

  • reaponseType只适用于异步请求,如果给同步请求设置了,那么将会抛出InvalidAccessError的异常

//使用responseTyep,以获取一张图片为例

const xhr=new XMLHttpRequest();

xhr.open(‘get’,‘/server/image.png’,true);

xhr.responseType=‘blob’//这里返回二进制类型的数据

xhr.οnlοad=function(){

if(xhr.status>=200&&xhr.status<300){

const blob=this.response

//…

}

}

xhr.send(null)

6.withCredentials属性
  • withCredentials属性是一个布尔值,表示跨域请求是否携带凭据信息(cookie、HTTP认证、以及客户端SSL证明等),默认为false

  • 如果需要跨域Ajax请求发送Cookie,需要withCredentials属性设置为true

  • 如果在同域下配置xhr.withCredentials,无论配置true还是fasle,效果都是一样的

//配置跨域

const xhr = new XMLHttpRequest();

xhr.open(‘get’,‘/server’,true);

xhr.withCredentials=true;

xhr.send(null)

  • 当配置了withCredentials为true时,必须在后端增加response头信息Access-Control-Allow-Origin,且必须指定域名,而不能指定为*。

  • 还需要添加Access-Control-Allow-Origin这个头信息为true;

//后端配置跨域

response.addHeader(“Access-Control-Allow-Origin”, “http://example.com”);

response.addHeader(“Access-Control-Allow-Origin”, true)

7.response属性
  • response属性表示服务器返回的数据,它可以时任何数据类型,比如字符串、对象、二进制对象等待,具体的类型由XMLHttpRequest.responseType属性决定

  • 如果本次请求没有成功或者数据不完整,该属性等于null

const xhr = new XMLHttpRequest()

xhr.onreadystatechange = function () {

if (xhr.readyState === 4) {

console.log(xhr.response)

}

}

8.responseText属性
  • responseText属性返回从服务器接收到的字符串,该属性为只读

  • 当readyState值为0、1、2时,responseText包含一个空字符串。当readyState值为3时(正在接收),响应中包含客户端还没完成的响应信息;当readyState为4时,此时响应已经完全接收,那么responseText包含完整的响应信息

if (xhr.readyState === 4) {

if (xhr.status >= 200 && xhr.status < 300) {

// 处理服务器的返回数据

console.log(xhr.responseText)

}

}

9.responseXML属性
  • 如果相应的内容类型时”text/xml“或者”appliction/xml“,这个属性中将保存着包含响应数据的HTML或者XML文档对象;该属性为只读类型

  • 无论内容类型是什么,响应主体的内容都会保存到responseText属性,而对于非XML数据而言,responseXML属性的值将为null

10.responseURL属性

responseURL属性时字符串,表示发送数据的服务器的地址,如果URL为空,则返回空字符串。如果URL有锚点,则位于URL#后面的内容会被删除。如果服务器端发生跳转,这个属性返回最后实际返回数据 的地址

const xhr=new XMLHttpReauest();

xhr.open(‘GET’,‘http://example.com/test’,true);

xhr.οnlοad=function(){

//返回http://example.com/test

console.log(xhr.responseURL)

}

xhr.send(null)

11.status属性(HTTP状态码)
  • 这个属性描述了HTTP状态码,属性返回一个整数。同时,当且仅当readyState值为3时(正在接收)和readyState=4时,这个属性才可以使用后。

  • 若在reagyState值小于3时试图取status的值,将会引发一个异常

  • status的值有:200表示成功,404表示为找到资源

if (xhr.readyState === 4) {

if (xhr.status >= 200 && xhr.status < 300) {

// 处理服务器的返回数据

}

}

12.statusText属性
  • statusText属性返回一个字符串,表示服务器发送的状态数目。比如ok和 Not Found。在请求发送之前,该属性的值是一个空字符串,如果服务器没有返回状态提示,该属性默认为欸OK。该属性为只读属性

  • 注意:要通过检测status属性来决定下一步的操作,不要依赖statusText,因为statusText在跨浏览器使用时不太可靠

1.4XMLHTTPRequest对象的方法详细说明
1.4.1.XMLHTTPRequest对象的方法

| 方法 | 描述 |

| — | — |

| abort() | 停止当前请求 |

| getAllResponseHeaders() | 把HTTP请求的所有响应首部作为键/值对返回 |

| getResponseHeader(“header”) | 返回指定首部的串值 |

| open(“method”,“url”,async) | 建立与服务器的连接,methos参数可以是GET、POST或者PUT等;url参数时相对的url或者绝对url。 |

| send(content) | 向服务器发送请求 |

| setRequestHeader(“header”,“value”) | 把指定的首部设置提供的值,注意:在设置任何首部之前必须在调用open()方法和send()方法之后设置 |

1.4.2.XMLHttpRequest对象方法的详细使用
1.open()方法-----用于初始化一个请求

open()方法接收三个参数:

  • 第一个参数methos:要发送请求的类型。比如GET、POSE、PYT等。

  • 第二个参数url:请求的URL

  • 第三个参数async:是否异步发送请求的布尔值。true为异步发送请求。

const xhr=new XMLHttpRequest();

xhr.open(‘get’,‘/userInfo’,true)

  • 调用open()

方法并不会真正的发送请求,而是启动一个琼琼以备发送;

2.send()方法-----用于发送HTTP请求

send()方法接收一个参数:

  • 参数data:作为请求主体发送的数据,如果不需要通过请求主体数据(即不传实际的data时),也必须传入null。

  • 参数data可以接收字符串、FromData(From表单)、Blob、ArrayBuffer等类型数据

const xhr=new XMLHTTPRequest();

xhr.send(null);

3. setRequestHeader()方法
  • setRequestHeader()方法可以设置自定义的请求头部信息

  • 接收两个参数:

第一个参数header:头部字段的名称

第二个参数value:头部字段的值

  • 要成功发送请求头部信息。,此方法必须在open()和send()之间调用

const xhr=new XMLHttpRequest();

xhr.open(‘get’,‘/server’,true);

xhr.setRequestHeader(‘MyHeader’,‘MyValue’);

xhr.send(null)

4.abort()方法和onabort事件
  • 在接收响应之前调用abort()方法来取下异步请求。当一个请求被终止后,那么它的readyState属性将被置为0.在终止请求之后,还应该对XMLHttpRequest对象进行解引操作。

  • 当调用abort()之后,会触发onabort事件

//abort()方法

const xhr=new XMLHttpRequest();

xhr.open(‘get’, ‘/server’, true);

xhr.οnabοrt=function(){

console.log(‘请求被终止’);

}

xhr.send(null);

//将会调用我们在上面定义的onabort回调函数

xhr.abort()

1.5 XMLHttpRequest进度事件相关的API
1 onload
  • 当请求成功,接收到完整的现溢数据时触发

  • 可以使用onload事件来替代readtstatechange事件,因为响应接收完毕后将触发onload事件,因此就没有必要检查readyState属性了。只要浏览器接收到服务器的响应,不管其状态如何,都会触发load事件

//使用onload事件来监听服务器的响应

const xhr = new XMLHttpRequest();

//当服务器响应完成时便会触发load事件

xhr.onload = function onload() {

console.log(‘请求数据接收完毕’)

if (xhr.status >= 200 && xhr.status < 300) {

console.log(xhr.responseText)

}

}

xhr.open(‘get’, ‘/server’, true);

xhr.send(null);

2.onerror

设置当请求失败时的监听函数

xhr.οnerrοr=function(){

//

console.log(‘请求失败’);

}

1.6 请求方式
1.6.1 GET请求
  • 将查询字符串参数追加到URL的末尾,将信息发送给服务器

  • GET参数的编码方式使无法认为干涉的,这导致了不同浏览器有不同的编码方式,因此最稳妥的使人工预编码,人工编码,人工解码,从而禁止浏览器的编码干涉

//GET请求的人工预编码

const xhr=new XMLHttpRequest();

//使用encodeURIComponent()进行编码

xhr.open(‘get’, ‘/server’, true);

const temParam=encodeURIComponent(‘age’);

const temValue=encodeURIComponent(‘20’);

xhr.open(‘get’,‘/server?temParam=tempValue&money=100’,true)

1.6.2 POST请求
  • POST请求把数据作为请求的主体(请求的body)提交,下面四种常见的PSET请求提交数据方式

1)application/json

当发送Ajax请求时,把appliction/json作为请求头,用来告诉服务器消息主体是序列化后的JSON字符串

2)text/xml

使用HTTP作为传输协议,XML作为哦编码方式的远程调用规范

3)application/x-www-form-urlencoded

浏览器原生form表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded方式提交数据

4)multipart/form-data

表单上传文件时,必须让form表单的enctype等于multipart/form-data

  • 举例如下

使用XMLHttpRequest模拟表单提交

将Content-Type头部信息设置为application/x-www-form-urlencoded。可以使用XMLHttpRequest对象来模仿表单提交。

const xhr = new XMLHttpRequest()

xhr.open(‘post’, ‘/server’, true)

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

const form = document.getElementById(‘myForm’)

// serialize()为表单序列化方法

xhr.send(serialize(form))

也可以使用XMLHttpRequest level 2的FormData来序列化表单数据。

const xhr = new XMLHttpRequest()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里获取前端学习资料

技术停滞不前!**

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-h7nd59uH-1712395687207)]

[外链图片转存中…(img-YzdkWkZK-1712395687208)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-UaU44xfh-1712395687208)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里获取前端学习资料

前端学习书籍导图-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值