博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XHR 的用法
阅读量:5811 次
发布时间:2019-06-18

本文共 3251 字,大约阅读时间需要 10 分钟。

  hot3.png

发送同步请求

一、open()方法

使用XHR 对象时,

首先,要调用open()方法,它 接收3个参数:
要发送的请求的类型、请求的URL和表示是否异步发送请求的布尔值。

xhr.open("get","example.php",false);

说明:这行代码会启动一个针对example.php 的get请求。需要注意的是:

  1. URL是相对于执行代码的当前页面或者可以使用绝对路径。
  2. 调用open()方法并不会真正的发送请求,而是启动一个请求以备发送。

二、send() 方法

1、 要发送特定的请求,必须像下面这样调用send() 方法:

//这里设置请求去是同步的,所以js代码会在等到服务器响应之后才继续执行。xhr.open("get","example.txt","false");xhr.send(null);

注意:这里的send() 方法接收一个参数,即作为请求主体发送的数据。如果不许要,则必须传入null,因为这个参数对于某些浏览器是必须的。

2、 调用send()方法之后,请求就会被分派到服务器上。

三、收到响应

1、 在收到响应后,响应的数据会自动填充XHR 对象的属性:

  • responseText:作为响应主体被返回的文本。
  • responseXML:如果响应的内容类型是“text/xml"或"application/xml",这个属性中将保存包含着响应数据的XML DOM文档。
  • status:响应的HTTP状态。
  • statusText:HTTP状态的说明。

2、访问 repsonseText

  1. 在接收到响应后,第一步检查status属性,以确定响应已经成功返回(http为200)。

  2. 此时,responseText 作为响应主体被返回的文本。

  3. 如果 responseText 的内容类型为“text/xml"或"application/xml", 那么,repsonseXML便可以访问。

  4. 此外,如果状态码为304,那么可以直接使用浏览器中缓存的版本。响应也是有效的。

3.、检查状态码

为确保接收到适当的响应,应该像下面 这样检查这两种状态代码:

var xhr = createXHR();xhr.open("get", "example.txt", false);xhr.send(null);if((xhr.status >=200 && xhr.status <300) || xhr.status ==304) {    alert(xhr.responseText);}else  {    alert("Request was unsuccessful:" + xhr.status);}

注意:

一般通过检测status来决定下一步操作。不要依赖 statusText,因为这个在跨浏览器使用时不太可靠。 如果响应的数据不是XML,那么就只保存到responseText中,而responseXml的值将为null。
此外,有些浏览器会报204状态码,其中ie非原生XHR会将204设置为1223,而原生XHR会将204规范为200。Opera会将204报告为status为0。

发送异步请求

发送异步请求,就是让javascript 继续执行而不必等待响应。

可以通过检测XHR 对象的 readyState属性,该属性标识请求、响应过程的当前的活动阶段。

这个可取的值如下:

0:未输出化。尚未调用open()方法。

1:启动。已经调用open()方法,但未调用send()方法。
2:发送。已经调用send()方法,但未接收到响应。
3:接收。已经接收到响应数据。
4:完成。已经接收到全部响应数据,而且可以在客户端使用了。

注意:

只要readyState 属性的值有一个值变成另一个值,都会出发一次readystatechange 事件。 可以利用这个事件来检测每次状态变化后 readyState 的值。

通过只检测readyState 值为4的阶段。不过必须在调用open()之前 制定 onreadystatechange 事件处理程序时才能确保跨浏览器兼容性。

例子:

var xhr = createXHR();xhr.onreadystatechange = function () {    if(xhr.readyState ==4) {        if((xhr.status>= 200 && xhr.status <300)|| xhr.status==304) {            alert(xhr.responseText);        } else {            alert("Request was unsuccessful:" + xhr.status);        }    }}xhr.open("get", "url", true);xhr.send(null);

说明:

以上代码利用DOM 0 级方法为XHR 对象添加了事件处理程序,原因是并非所有浏览器都支持DOM2 级方法 。
与其他事件处理程序不同,这里没有向 onreadystatechange 事件处理程序中传递event 对象;必须通过XHR 对象本身来确定下一步该怎么做。

注意:

不要使用this 对象,需要用xhr对象。如果使用this对象,在有的浏览器中可能发生错误。使用实际的XHR对象实例变量是较为可靠的一种方式。

此外:

在接收到响应之前可以调用 abort()方法来异步请求,

xhr.abort();

调用这个方法后,XHR 对象会停止触发实践。在终止请求后,还应该对XHR对象进行解引用。 因为,由于内存问题,不建议XHR 对象。

获取 HTTP 头部信息

每个HTTP请求和响应都带有相应的头部信息,XHR 也提供了操作这两种头部信息的方法。

默认情况下,在发送XHR 请求的同时,还会发送的下列头部信息。 Accept: Accept-Charset: ...

使用 setRequestHeader() 方法可以设置自定义的请求头部信息。

注意,setRequestHeader() 必须在调用open() 方法之后且调用 send() 方法之前调用。

调用 XHR 对象的getResponseHeader()方法并传入头部字段名称,可以取得相应的响应头部信息。

调用getAllResponseHeaders()方法则可以取得一个包含所有响应头部信息的长字符串。

...xhr.open("get","example.php",true);xhr.setRequestHeader("MyHeader","MyValue");xhr.send(null);//-----------------------------var myHeader = xhr.getResponseHeader("MyHeader");

在没有自定义信息的情况下,getAllResponseHeaders() 方法通常会返回如下所示的多行文本内容:

Content-Type: text/htmlServer: WebStorm 2016.3.1Date: Fri, 25 Nov 2016 15:02:10 GMTX-Frame-Options: SameOriginX-Content-Type-Options: nosniffx-xss-protection: 1; mode=blockCache-Control: private, must-revalidateLast-Modified: Fri, 25 Nov 2016 15:02:10 GMTContent-Length: 1894

转载于:https://my.oschina.net/lemos/blog/794502

你可能感兴趣的文章
层序遍历、遍历二叉树的应用
查看>>
快速安装.net 4.0
查看>>
[PHP] PHP & HTML & JavaScript & MySQL 代码如何互相传值
查看>>
[Swust OJ 715]--字典序问题(组合数预处理/数位dp)
查看>>
获得正在编辑行的数据 esayui datagrid
查看>>
jenkins持续化集成工具 centos 6.5安装
查看>>
ASCII 、UNICODE和UTF-8
查看>>
注解的那些事儿(一)| 为什么要使用注解?
查看>>
mycat安装
查看>>
宝洁面试经典八大问题(附答案范例)
查看>>
挣值管理记忆
查看>>
mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)
查看>>
Var的用法解析
查看>>
C++_基础4-分支语句和逻辑运算符
查看>>
java方法中使用js的alert。
查看>>
LeetCode:Implement strStr()
查看>>
集合内查找的四种方式
查看>>
制作首页的显示列表
查看>>
区块链入门级别认知(blockchain)
查看>>
Linux系统——28个命令行下的工具
查看>>