XHR对象
一、XMLHttpRequest对象
var xhr = new XMLHttpRequest(),
i = 0;
for(var key in xhr){
if(xhr.hasOwnProperty(key)){
i++;
}
}
console.log(i); //
console.log(XMLHttpRequest.prototype.hasOwnProperty('timeout')); //true
会发现XMLHttpRequest实例对象没有自身属性,实际上,它的所有属性均来自于XMLHttpRequest.prototype。
追根溯源
xhr => XMLHttpRequest.prototype => XMLHttpRequestEventTarget.prototype => EventTarget.prototype => Object.prototype
二、XMLHttpRequest实例的属性
1、readyState
只读,readyState记录了ajax调用过程中所有可能的状态,表示XMLHttpRequest请求当前所处的状态。
0表示未初始化,请求已建立;
1表示初始化,请求已建立,但未发送;
2表示发送数据,请求已发送;
3表示数据传送中,请求处理中,响应的数据还不够齐全;
4表示完成,数据接收完毕。
2、response
只读,表示服务器的响应内容。
3、responseType
表示服务器返回数据的类型,缺省为空字符串,可取 "arraybuffer","blob","document","json","text" 共五种类型。
4、responseText
只读,表示服务器响应内容的文本形式。
5、responseXML
只读, responseXML表示xml形式的响应数据, 缺省为null, 若数据不是有效的xml, 则会报错.
6、status
只读,status表示本次请求所得到的HTTP状态码,初始值为0。如果服务器没有显式地指定状态码,那么status将被设置为默认值,即200。基本上,只有2xx和304的状态码,表示服务器返回是正常状态。
1** 消息;2** 成功;3** 重定向; 4** 请求错误; 5** 服务器错误。
200,OK,访问正常
301,Moved Permanently,永久移动
302,Move temporarily,暂时移动
304,Not Modified,未修改
305,请求的资源必须通过指定的代理才能被访问
307,Temporary Redirect,暂时重定向
400,语义有误,当前请求无法被服务器理解
401,Unauthorized,未授权
403,Forbidden,禁止访问,服务器已经理解请求,但是拒绝执行它。
404,Not Found,未发现指定网址,请求失败,在服务器上面没有找到请求的资源。
500,Internal Server Error,服务器代码错误
7、statusText
只读,statusText表示服务器发送的状态提示,包含整个状态信息,比如"200 OK"。
8、timeout
用于指定ajax的超时时长,表示多少毫秒后,如果请求仍然没有得到结果,就会自动终止。如果该属性等于0,就表示没有时间限制。
9、responseURL
responseURL返回ajax请求最终的URL,如果请求中存在重定向,那么responseURL表示重定向之后的URL。
10、withCredentials
withCredentials是一个布尔值,默认为false,表示跨域请求中不发送cookies等信息。当它设置为true时,cookies,authorization headers 或者TLS客户端证书都可以正常发送和接收。显然,它的值对同域请求没有影响,该属性适用于IE10+,opera12+及其他现代浏览器。
xhr.withCredentials = true;
服务器必须显示返回Access-Control-Allow-Credentials这个头信息。
Access-Control-Allow-Credentials: true
11、upload
属性默认返回一个XMLHttpRequestUpload对象,用于上传资源,该对象具有如下方法:
onloadstart
onprogress
onabort
onerror
onload
ontimeout
onloadend
三、XMLHttpRequest实例的方法
1、getResponseHeader()
getResponseHeader方法用于获取ajax响应头中指定字段的值,如果response headers中存在相同的字段,那么它们的值将自动以字符串的形式连接在一起。
2、getAllResponseHeaders()
getAllResponseHeaders方法用于获取所有安全的ajax响应头,响应头以字符串形式返回。每个HTTP报头名称和值用冒号分隔,如key:value,并以\r\n结束。
3、open()
open方法用于指定发送HTTP请求的参数,它的使用格式如下,一共可以接受五个参数。
void open(
string method, //表示HTTP动词,比如“GET”、“POST”、“PUT”和“DELETE”。
string url, //表示请求发送的网址。
optional boolean async, //格式为布尔值,默认为true,表示请求是否为异步。
optional string user, //表示用于认证的用户名,默认为空字符串。
optional string password //表示用于认证的密码,默认为空字符串。
);
4、send()
send方法用于实际发出HTTP请求。如果不带参数,就表示HTTP请求只包含头信息,也就是只有一个URL,典型例子就是GET请求;如果带有参数,就表示除了头信息,还带有包含具体数据的信息体,典型例子就是POST请求。
所有XMLHttpRequest的监听事件,都必须在send()方法调用之前设定。
5、setRequestHeader()
setRequestHeader方法用于设置HTTP头信息。该方法必须在open()之后、send()之前调用。如果该方法多次调用,设定同一个字段,则每一次调用的值会被合并成一个单一的值发送。
//指定请求的type为json格式
xhr.setRequestHeader("Content-type", "application/json");
//除此之外, 还可以设置其他的请求头
xhr.setRequestHeader('x-requested-with', '123456');
6、overrideMimeType()
overrideMimeType方法用于强制指定response的MIME类型,即强制修改response的Content-Type。
xhr.overrideMimeType("text/xml; charset = utf-8");
xhr.send();
四、XMLHttpRequest实例的事件
1、onreadystatechange事件
onreadystatechange事件回调方法在readystate状态改变时触发,默认会传入Event实例。在一个收到响应的ajax请求周期中,会触发4次onreadystatechange事件。
2、onloadstart事件
onloadstart事件回调方法在ajax请求发送之前触发,触发时机在readyState==1状态之后,readyState==2状态之前。onloadstart方法中默认将传入一个ProgressEvent事件进度对象。
3、onprogress事件
onprogress事件回调方法在readyState==3状态时开始触发,默认传入ProgressEvent对象。有兼容性问题,适用于IE10+及其他现代浏览器。
//跟踪上传进度
xhr.upload.onprogress = function(e){
var percent = 100 * e.loaded / e.total;
console.log('upload: ' + precent + '%');
}
4、onerror事件
onerror事件回调方法在ajax请求出错后执行,通常只在网络出现问题时或者ERR_CONNECTION_RESET时触发(如果请求返回的是407状态码,chrome下也会触发onerror)。
5、onabort事件
用来终止已经发出的HTTP请求。取消后, readyState状态将被设置为0(UNSENT)。
6、onload事件
onload事件回调方法在ajax请求成功后(readyState==4状态后)触发。
7、onloadend事件
onloadend事件回调方法在ajax请求完成后(readyState==4状态后或者readyState==2状态后)触发,方法中默认传入一个ProgressEvent事件进度对象。
XHR对象的更多相关文章
- 深入理解ajax系列第一篇——XHR对象
× 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...
- Ajax原生XHR对象
前端学了有一段时间了,在项目中我通常使用的都是jQuery封装好的Ajax函数($.ajax.$.get.$.post),使用非常的简单方便,但为了更清楚的了解Ajax,需要学习原生xhr对象. ...
- ajax入门之建立XHR对象 (1)
ajax入门之建立XHR对象 今天帮朋友写了一个简单的ajax的demo,发现了一些东西,决定写一篇文章记录一下,避免以后挖坑. 创建XMLHttpRequest 通常 function create ...
- 利用XMLHttpRequest(XHR)对象实现与web服务器通信
XMLHttpRequest对象:XMLHttpRequest是一个JS对象,页面利用它与web服务器通信.XHR对象的基本思想是让JS代码自己发送请求,以便随时获取数据,这种请求是异步的,也就是说请 ...
- 封装通用的xhr对象(兼容各个版本)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- XHR 对象实例所有的配置、属性、方法、回调和不可变值
当我们声明了一个XMLHttpRequest对象的实例的时候,使用for-in来循环遍历一下这个实例(本文使用的是chrome45版本浏览器),我们会发现在这个实例上绑定了一些内容,我把这些内容进行了 ...
- 深入理解 ajax系列第一篇(XHR 对象)
1999年,微软公司发布了IE5, 第一次引入新功能:允许javascript 脚本向服务器发起 hffp 请求.这个功能方式并没有被引起注意,知道2004年 Gmail 发布和 Google Map ...
- 为XHR对象所有方法和属性提供钩子 全局拦截AJAX
摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...
- 创建兼容的XHR对象
function createXHR () {//创建XMLHttpRequest对象 var xhr=null; if(window.XMLHttpRequest){ createXHR=creat ...
随机推荐
- Java泛型方法与泛型类的使用------------(五)
泛型的本质就是将数据类型也参数化, 普通方法的输入参数的值是可以变的,但是类型(比如: String)是不能变的,它使得了在面对不同类型的输入参数的时候我们要重载方法才行. 泛型就是将这个数据类型也搞 ...
- python3爬虫二
1.获取列表页文章url集合: scrapy shell http://blog.jobbole.com/all-posts/ response.css('div.post-meta a.archiv ...
- aircrack-ng笔记
开启监听: airmon-ng start wlan0 抓包: airodump-ng wlan0mon 查看wifi ^C结束 airodump-ng -c 6 --bssid C8:3A:35:3 ...
- nginx转发
1.下载nginx:官网(http://nginx.org)右侧下载,进入下载页,选在需要下载的版本 2.将压缩包解压到指定的目录下 (D:\Environments\nginx-1.8.0) 3.启 ...
- Web 中调用FreeSWITCH的Portal GUI配置记录
具体设定步骤: ①加载 mod_xml_rpc 模块:load mod_xml_rpc 若想让该模块在FreeSWITCH启动时而自动加载,在conf/autoload_configs/modules ...
- [学习笔记]Java代码中各种类型变量的内存分配机制
程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而 ...
- php数组去重(一维数组)
<?php $arr = ['1', '1', 'PHP', 'PHP', 2, 3]; print_r($arr); echo "<br>"; print_r( ...
- Codeforces 448C Painting Fence(分治法)
题目链接:http://codeforces.com/contest/448/problem/C 题目大意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅 ...
- bzoj 1060
这题其实有点骗人... 通过观察很容易发现:考虑某一些叶节点的LCA,由于根节点到这个LCA的距离唯一,故要求这些叶节点到这一LCA的距离都相等 于是我们仅需dfs,找到次底层的节点,然后使这些节点的 ...
- JQuery动画详解(四)
一:基本动画show()显示隐藏的匹配元素.这个就是 'show( speed, [callback] )' 无动画的版本.如果选择的元素是可见的,这个方法将不会改变任何东西.无论这个元素是通过hid ...