使用XMLHttpRequest对象完成原生的AJAX请求
1.大家眼中的Ajax
说到Ajax,只要有过前端开发经验的童鞋一定都不陌生,大都知道它就是一种与后端之间的通信技术,通过这个神奇的家伙,我们不用像传统表单那样填完信息一点提交就呼啦呼啦跳转了。Ajax最大的一个优势就是通过异步请求达到局部刷新的目的,这样就大大提高了用户体验。可是Ajax就是我们平时使用得最多的jQuery中的$.ajax()吗?答案肯定不是的,那我们就来一起看看原生的Ajax究竟长啥样把!
2.获取XMLHttpRequest
2.1 为什么要获取XMLHttpRequest对象
Ajax技术的核心是XMLHttpRequest对象(简称XHR)
2.2 如何获取XMLHttpRequest对象
- 由于IE5是第一款引入XHR对象的浏览器,所以在IE7之前其实都不是叫XMLHttpRequest,具体要兼容IE7之前浏览器的话可以查阅一下《高级程序设计》本文重点是讨论如何实现Ajax请求,所以,默认在内置了XHR的IE7+和其他现代浏览器下,所以:
 
function getXhr(){
if (typeof XMLHttpRequest != 'undefined') {
return new XMLHttpRequest();
}
}
- 这样就得到了一个XHR的实例对象
 
3.大体的流程
3.1 初始化请求
- 使用XHR对象时,使用的第一个方法就是open(),这个方法不会发送请求,但会初始化一个请求准备发送,第三个参数默认是true,也就是异步的
 
xhr.open('get', 'example.php', false);
3.2 发送请求
- GET请求:发送的值为空,一般写上null,适配有些浏览器
 
xhr.open('GET', url);
xhr.send(null);
- POST请求,要模拟表单提交请求的话就将Content-type头部信息设置为application/x-www-form-urlencoded,并且发送的是一个经过序列化之后的字符串
 
xhr.open('POST', url);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(stringData);
3.3 监控请求状态,处理请求数据
- xhr对象有且仅有一个事件onreadystatechange,注意所有字母都是小写的,javascript和Java一样都是区分大小写的。
 - 每一次xhr对象的readyState状态值改变都会触发该事件,但是该方法不能为单独的一个xhr对象绑定多个事件处理逻辑,即onreadystatechange只能绑定一个事件处理的function,如果你想处理多件事情,那么只能在绑定的function中进行多事件处理的逻辑调用。
 
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
document.getElementById("unInfo").innerHTML = xhr.responseText;
}
}
}
4.重要属性
4.1 readyState属性,这个属性可能的取值如下:
- 0:未初始化,尚未调用open()方法
 - 1:启动。已经调用open()方法,但尚未调用send()方法
 - 2:发送:已经调用send()方法,但尚未收到响应
 - 3:接收。已经接收到部分响应数据。
 - 4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
 
4.2 响应的数据会自动填充XHR对象的属性,包含以下属性
- responseText:作为响应主题被放回的文本
 - responseXML:如果响应的内容类型是"text/xml"或"application/xml",这个属性中将保存包含着响应数据的XMLDOM文档
 - status:响应的HTTP状态
 - statusText:HTTP状态的说明
 
5.一次完整的XHR请求
GET
function getXhr(){
if (typeof XMLHttpRequest != 'undefined') {
  return new XMLHttpRequest();
}
}
var xhr = getXhr();
//GET请求
xhr.open('GET', '/user/checkLogin');
xhr.send(null);
xhr.onreadystatechange = function(res) {
if (xhr.readyState == 4) {
  if (xhr.status == 200) {
    console.log(JSON.parse(xhr.responseText))
  }
}
}
POST
  function getXhr(){
    if (typeof XMLHttpRequest != 'undefined') {
      return new XMLHttpRequest();
    }
  }
  var xhr = getXhr();
  var stringData = {
    uname: '123',
    password: '123',
    code: ''
  }
  stringData = JSON.stringify(stringData);
  //POST请求
  xhr.open('POST', '/user/login');
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhr.send(stringData)
  xhr.onreadystatechange = function(res) {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        console.log(JSON.parse(xhr.responseText))
      }
    }
  }
参考文章:
- 【AJAX】XmlHttpRequest对象详解(API)
 - XMLHttpRequest API 使用指南
 - 《JavaScript高级程序设计》第21章
 
使用XMLHttpRequest对象完成原生的AJAX请求的更多相关文章
- 原生js ajax请求
		
什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...
 - H5 FormData对象的使用——进行Ajax请求并上传文件
		
XMLHttpRequest Level2 添加了一个新的接口——FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...
 - PHP.  02®.   Ajax异步处理、常见的响应状态、XMLHttpRequest对象及API、ajax的get/post方法、
		
异步对象 a)创建异步对象 b)设置请求的url等参数 c) 发送请求 d)注册时间 e)在注册的事件中获取返回的内容并修改页面显示的内容 布尔类型不能直接用echo输出 常见的响应状态 Ajax概 ...
 - 原生的ajax请求
		
原生ajax请求的步骤: get 请求: 1,创建一个xhr变量 var xhr=new XMhttpRequest(); 2,设置请求方式和请求地址 xhr.open('url','http//19 ...
 - 原生的ajax请求----(播放托管到爱奇艺上的视频)
		
播放视频 $(function(){ //视频播放 $('.play-icon').click(function () { $.ajax({ type:"get", url: &q ...
 - 原生JS Ajax 请求
		
var username = document.getElementById('username').value; var password = document.getElementById('pa ...
 - 【转】分享JavaScript监听全部Ajax请求事件的方法
		
若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件,然而我遇到的却是用原生JavaScript ...
 - XMLHttpRequest对象解读
		
<!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...
 - js ajax 请求
		
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 
随机推荐
- 跨域问题-cors
			
什么是跨域如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求.比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy). 具 ...
 - linux_rpm命令
			
rpm 常用命令 1.安装一个包 # rpm -ivh 文件名 2.升级一个包 # rpm -Uvh文件名 3.移走一个包 # rpm -e文件名 4.安装参数 --force 即使覆盖属于其它包的文 ...
 - CodeForces - 632E Thief in a Shop (FFT+记忆化搜索)
			
题意:有N种物品,每种物品有价值\(a_i\),每种物品可选任意多个,求拿k件物品,可能损失的价值分别为多少. 分析:相当于求\((a_1+a_2+...+a_n)^k\)中,有哪些项的系数不为0.做 ...
 - LookupEdit已选过后如何删除值使其空白
			
属性Properties 的AllowNullInput 设置为True,就可以删除了. 当选择值后,按下control+delete就可以变为空白
 - 对于JVM中方法区,永久代,元空间以及字符串常量池的迁移和string.intern方法
			
在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...
 - 获取 config文件的节点值
			
System.Configuration.ConfigurationManager.AppSettings["followTemplate"];
 - 快用Visual Studio(五)- 语言特性
			
HTML 自带Emment $ SHIFT + OPTION + F:格式化代码 其他语言特性提示 CSS & LESS hover属性,提示样式对象标签 $ CMD + SHIFT + O: ...
 - Java ArrayList在foreach中remove的问题分析
			
目录 iterator itr.hasNext 和 itr.next 实现 倒数第二个元素的特殊 如何避坑 都说ArrayList在用foreach循环的时候,不能add元素,也不能remove元素, ...
 - 数据库还原,System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 (Microsoft.SqlServer.SmoExtended)
			
数据库还原问题: System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权. (Microsoft.SqlServer.SmoExtende ...
 - poj3977 - subset - the second time - 暴力 + 二分
			
2017-08-26 11:38:42 writer:pprp 已经是第二次写这个题了,但是还是出了很多毛病 先给出AC代码: 解题思路: 之前在培训的时候只是笼统的讲了讲怎么做,进行二分对其中一边进 ...