扒一扒 EventServiceProvider 源代码
Ajax
用一句话来说就是无须刷新页面即可从服务器取得数据。注意,虽然Ajax
翻译过来叫异步JavaScript
与XML
,但是获得的数据不一定是XML
数据,现在服务器端返回的都是JSON
格式的文件。
完整的Ajax
请求过程
完整的Ajax
请求过程
- 创建
XMLHttpRequest
实例- 发出
HTTP
请求- 接收服务器传回的数据
- 更新网页数据
下面先看一个红宝书上给出的发起Ajax
请求的例子,API
的用法在后面章节给出。
var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据
if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码
console.log(xhr.responseText); // 输出响应的文本
} else {
console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码
}
}
};
xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求
xhr.send(null); // 设置HTTP请求携带参数,null为不带参数
Ajax
请求过程详解
1. 创建XMLHttpRequest
实例
从上面的的代码可以看出,创建一个XHR
实例方式为:
var xhr = new XMLHttpRequest();
2. 发出HTTP请求
实例创建好后,首先需要启动一个HTTP
请求,使用XHR
的open()
方法,open
方法接受三个参数
XMLHttpRequest.open(method, url, isAsync)
// 例如
xhr.open('get', 'http://www.baidu.com', true)
第一个参数为http
请求使用方法,如('get','post'等),第二是参数是请求的url
, 第三个参数代表是否异步发送请求(可选)。调用open()
方法后会启动一个http
请求,但它不会立即发送请求,处于待命状态。需要注意的是:请求的url
必须要跟请求源域(origin)同域,也就是说协议、域名、端口号要一致,跨域请求要使用别的方法。接着调用send()
方法就会发出这个http
请求。
xhr.open('get', 'http://www.baidu.com', true)
xhr.send(null)
send()
方法接受一个参数,为http
请求发送的数据(通常用于'post'方法),如果为null
,表示不发送数据。至此,一个异步的http
请求就发送到了服务器。
3. 接收服务器传回的数据
3.1 发送同步请求
如果将open
方法的第三个参数设为false
,即为同步请求,当收到服务器的响应后,相应的数据会自动填充到XHR
对象的属性中,主要包括以下四个:
responseText
:作为响应主体被返回的文本。responseXML
: 响应返回的XML
文档,能接收到的前提是,响应的Content-Type
字段的值为text/xml
或者application/xml
。status
:HTTP
状态码。statusText
:HTTP
状态码说明。
当客户端收到以上信息后,首先要判断HTTP
状态码来确认响应是否成功,状态码在200-300之间表示请求成功,同时304代表请求资源未被修改,可使用浏览器本地缓存。如果成功就可以获取响应报文主体中的数据了。
xhr.open('get', 'http://www.baidu.com', false)
xhr.send(null)
if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码
console.log(xhr.responseText); // 输出响应的文本
} else {
console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码
}
3.2 发送异步请求
如果将open
方法的第三个参数设为true
,即为异步请求。那么就需要一个事件来通知程序异步请求的结果是否返回。XHR
对象中的readyState
属性,表示请求/响应整个过程所处的阶段,它有五个值分为对应五个阶段:
- 0:未初始化。未调用
open()
方法。 - 1:启动。已经调用
open()
方法,但未调用send()
方法。 - 2:发送。已调用
send()
方法,但未收到响应。 - 3: 接收。已经接收到部分响应数据。
- 4:完成。已经接受到全部响应数据。
readyState
的值每变化一次,都会触发一次readStatechange
事件,我们定义一个事件处理函数onreadStatechange()
,并监听readyState == 4
状态,就可以得知响应数据已全部收到,并进行下一步操作。那么就是文章开头给出的代码:
var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据
if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码
console.log(xhr.responseText); // 输出响应的文本
} else {
console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码
}
}
};
xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求
xhr.send(null); // 设置HTTP请求携带参数,null为不带参数
补充XHR中三个有用的事件
timeout
事件
当超出了设置时间还未收到响应,就会触发timeout
事件,进而调用ontimeout
事件处理程序。同时timeout
也是XHR
的一个属性,用于设置这个时间阈值。下面是用法:
xhr.ontimeout = function() {
alert('timeout!')
}
xhr.open('get', 'http://www.baidu.com', true)
xhr.timeout = 1000 // 时间阈值设为1秒
xhr.send(null)
load
事件
load
事件用于简化对readState
值的判断,响应数据全部接收完毕后(也就是readState == 4
)会触发load
事件,使用onload
事件处理函数进行后续操作,onload
会接收一个event
对象,它的target
属性等于XHR
对象,当然我们在定义这个事件处理函数时也可以不传入这个参数,来看下面的用法:
var xhr = new XMLHttpRequest()
xhr.onload = function () {
if(xhr.status >=200 && xhr.status < 300 || xhr.status == 304) {
console.log(xhr.responseText); // 输出响应的文本
} else {
console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码
}
}
xhr.open('get', 'http://www.baidu.com', true)
xhr.send(null)
这样就不用去关心readyState
值的变化情况了。当然如果想在特定readyState
值上做一些逻辑处理,还是要用之前的方法。
progress
事件
这个是很有用的一个事件,progress
事件会在浏览器接收数据期间周期触发,代表整个请求过程的进度,它的事件处理程序onprogress
接收一个event
对象,event.target
是XHR
对象,另外event
还有三个属性:
lengthComputable
:Boolean值,进度信息是否可用。position
:已经接收到的字节数。totalSize
:总共要接收的字节数,被定义在响应报文的Content-Length
字段中。
如果响应报文中有Content-Length
字段,那么我们就可以计算当前时刻响应数据的加载进度了,这也是之前看到的一个面试题。看下面的代码:
xhr.onprogress = function(event) {
if(event.lengthComputable) {
console.log(`Received: ${(event.position/event.totalSize).toFixed(4)*100}%`);
}
}
其他还有很多有用的API,如FormData
表单序列化,overrideMimeType()
重写XHR
响应的MIME
类型等等,后面慢慢更新。
原文地址:https://segmentfault.com/a/1190000015668383
扒一扒 EventServiceProvider 源代码的更多相关文章
- linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一
在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...
- linux2.6.24内核源代码分析(1)——扒一扒sk_buff
最近研究了linux内核的网络子系统上的网络分组的接收与发送的流程,发现这个叫sk_buff的东西无处不在,内核利用了这个结构来管理分组,在各个层中传递这个结构,因此sk_buff可以说是linux内 ...
- 扒一扒asp.net core mvc控制器的寻找流程
不太会排版,大家将就看吧. asp.net core mvc和asp.net mvc中都有一个比较有意思的而又被大家容易忽略的功能,控制器可以写在非Web程序集中,比如Web程序集:"MyW ...
- View绘制详解(三),扒一扒View的测量过程
所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...
- 扒一扒ReentrantLock以及AQS实现原理
提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一 ...
- 扒一扒.NET Core的环境配置提供程序
很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提供程序 ...
- 扒一扒EOS的前世今生
扒一扒EOS的前世今生 EOS是什么? EOS可以认为是Enterprise Operation System的缩写,即商用的一款分布式区块链操作系统,EOS主要为了解决百万级用户的使用问题,为企 ...
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
- jQuery源码学习扒一扒jQuery对象初使化
神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...
- 扒一扒MathType不为人知的技巧
MathType作为一款编辑数学公式的神器,很多人在使用它时只是很简单地使用了一些最基本的模板,很多功能都没有使用.MathType功能比你想象中的大很多,今天我们就来扒一扒MathType那些不为人 ...
随机推荐
- 解决 This application requires Java Runtime Environment XX
已经安装了 jdk ,并且设置好了 java 环境变量,CMD 运行 java 或 javac 都正常,其他依赖 jdk 的应用程序都能正常运行.但是在运行 jd-gui 1.1.0 的时候,出现错误 ...
- Bazinga HDU - 5510 不可做的暴力
http://acm.hdu.edu.cn/showproblem.php?pid=5510 想了很久队友叫我用ufs + kmp暴力过去了. fa[x] = y表示x是y的子串,所以只有fa[x] ...
- ubuntu网络已禁用解决办法
1.首先停掉network-manager这个服务 sudo service network-manager stop 2.删除掉NetworkManager.state这个文件 sudo rm /v ...
- Java面向对象_多态性、instanceof关键字
一.多态 分类:方法的重载与重写:对象的多态性 对象的多态性:向上转型:将子类实例转为父类实例 格式:父类 父类对象=子类实例;是自动转换 向下转型:将父类实例转为子类实例 格式:子类 子类对 ...
- 三,JVM 自带命令行工具之JMap
jmap:java内存映像工具 jmap(Memory Map for java ) 命令用于生成堆转储快照(一般被称为headdump 或dump文件) jmap命令格式:jmap [option ...
- Elasticsearch支持的字段类型
es支持下列简单的字段类型: String: string Whole number: byte, short, integer, long Floating point: float, double ...
- UICollectionView笔记1
WWDC 2012 Session笔记——205 Introducing Collection Views 这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站 ...
- 认识与入门 MarkDown (转Te_Lee)
Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...
- Day6 盒模型
Day6 盒模型 1.一.标准盒模型(w3c盒模型) 1)组成部分: content + padding + border + margin 内容 ...
- 面向对象之套接字(socket)和黏包
一丶套接字(socket) tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 基于UDP协议的socket server端: import socket udp_sk = socke ...