Ajax基础知识梳理
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
类型等等,后面慢慢更新。
Ajax总结篇
原文地址:https://segmentfault.com/a/1190000015668383
Ajax基础知识梳理的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- Anliven - 基础知识梳理汇总 - 软件测试
基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...
- Ajax基础知识《一》
对于网站开发人员,一定不会陌生的Ajax技术,本篇就让我们认识一下它,或许在日后的开发过程中我们就可以使用到.Ajax在那方面使用的比较多呢?答案:表单注册,传统的表单注册,有时需要填写大量的信息,当 ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
随机推荐
- 使用Telerik StyleMananger 改变Silverlight Button样式
Telerik 支持更改以下控件样式 System.Windows.Button System.Windows.ScrollViewer System.Windows.CheckBox System. ...
- .net 记录
Stack Overflow 2016最新架构探秘 http://www.infoq.com/cn/news/2016/03/Stack-Overflow-architecture-insi#rd N ...
- 关于SQL Server数据库中的标识列
一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...
- 项目上传至Github
到https://github.com/ 注册用户,然后点 Start a project,创建仓库 记住这个 地址. 再去 https://git-scm.com/downloads 下载git 安 ...
- Authentication to host '***‘' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.
如下场景: 一个页面中需要用户填入文字信息,并上传图片,上传图片是单独调用上传文件接口的,当用户上传图片后,马上点保存,就会报错. Authentication to host '***‘' for ...
- BZOJ2216: [Poi2011]Lightning Conductor(DP 决策单调性)
题意 题目链接 Sol 很nice的决策单调性题目 首先把给出的式子移项,我们要求的$P_i = max(a_j + \sqrt{|i - j|}) - a_i$. 按套路把绝对值拆掉,$p_i = ...
- js如何获取上个月第一天和最后一天
var nowdays = new Date(); var year = nowdays.getFullYear(); var month = nowdays.getMonth(); if(month ...
- JavaScript:理解Promise方法
什么是promise? Promise的核心思想是代表异步操作的一个结果,并且promise具有三个状态(pending初始状态,fulfilled成功状态,rejected失败状态).我们可以理解为 ...
- iOS 制作表格 (数据源控制行,列数)
记得去年面试的过程中,有一个面试官问我怎么制作表格.由于之前也没有做过,当时有点懵逼,今天想起来了,就用tableview制作了一个,望不要有人像我一样掉坑了, 直接上代码: // // ViewCo ...
- elasticsearch RestHighLevelClient 使用方法及封装工具
目录 EsClientRHL 更新日志 开发原因: 使用前你应该具有哪些技能 工具功能范围介绍 工具源码结构介绍 开始使用 未来规划 git地址:https://gitee.com/zxporz/ES ...