1999年,微软公司发布了IE5, 第一次引入新功能:允许javascript 脚本向服务器发起 hffp 请求。这个功能方式并没有被引起注意,知道2004年 Gmail 发布和 Google Map 发布,才引起广泛关注。2005 年2月,ajax 这个词第一次正式提出,指围绕这个功能进行开发一整套做法,从此,ajax称为脚本发起http通信的代名词, W3C也在 2006 年发布了它的国际标准。

概述:

  Ajax是 asynchronous javasricot and XM;L 的简写,中文翻译是异步的 javascript 和 Xml, 这一技术能够向服务器请求额外的数据而无需卸载页面,回带来更好的用户体验,虽然名字中包含 XML,但 ajax 通信与数据格式无关。

  Ajax 包含以下几个步骤:

    1、创建 Ajax 对象

    2、发出 HTTP 请求

    3、接受服务器传回的数据

    4、更新网页的数据

    那么,概括起来就是一句话,Ajax 通过原生的 XMLHttpRequest 对象发送出的 HTTP 请求,得到服务器的数据后,在进行处理

创建:

  ajax 技术的核心是 XMLHttpRequest对象(简称 XHR), 这是由微软收先引入的一个特性,其他浏览器提供商后来都提供了相同的实现,XHR 为向服务器发送请求和解析服务服务器响应提供了流畅的接口,能够以异步方式从服务器取得更多信息,意味着用户单机后,可以不比刷新页面取得新的数据。

  IE5是第一款引入 XHR 对象的浏览器,在 IE5 中,XHR 对象是通过 MSXML 库中的一个 Active 对象实现的,,而IE7+及其他标准浏览器都支持原生的XHR对象

  创建一个 XHR 对象,也叫实例化一个 XHR对象,因为 XMLHTTPRequest() 是一个构造函数,下面是创建 XHR 对象的兼容写法:

  

var xhr:
if(window.XMLHttpRequest){
xhr = XMLHttpRequest();
}else{
xhr = new ActiveXobject("Microsoft.XMLHTTP");
}

  注意:

    如果要建立N个不同的请求,就要手机用不同的 XHR 对象,当然可以重用以存在的 XHR 对象,但这会终止之前该对挂起的任何请求

发送请求:

  open()

    在使用 XHR 对象时,要调用的第一个方法就是 open(),如下所示,该方法接受 3 个参数

xhr.open('get','example.php', false)

    1、open() 方法的第一个参数用于指定发送请求的方式,这个字符串,不区分大小写,但通常使用大写字母,“GET”和“POST”广泛支持

    2、“GET” 是常规请求,它使用与当 URL 完全指定资源,当请求对服务没有任何副作用以及当读物器的响应式可缓存的情况下

    3、“POST” 方发用于 HTML 表单,它在请求主体中包含额外数据且这些数据常存储到服务器上的数据库中,相同的 URL 的重复 POST 请求从服务器得到的响应可能从不同,同时不应该缓存使用这个方法的请求

    4、除了"GET"和"POST"之外,参数还可以是"HEAD"、"OPTIONS"、"PUT"。而由于安全风险的原因,"CONNECT"、"TRACE"、"TRACK"被禁止使用

    

    5、open() 方法的第二个参数是 URL ,该 URL 相对于执行代码的当前页面,且只能向同一个域中使用相同的端口和协议的 URL 发送请求,如果 URL 与启动请求的页面由任何差别,都会引发安全错误

    6、open() 方法的第三个参数是表示是否异步发送请求的布尔值,如果不填写,默认为 True,表示异步发送

    7、如果请求一个收密码保护的 URL 。把用于认证的用户名和密码作为第4和第5参数传递给 open() 方法

  send()

    send() 方法接受一个参数,既要作为请求主体发送的数据,调用 send() 方法后,请求被分到服务器

    如果 "GET" 方法, send() 方法无参数,或参数为 null ,如果是 post 方法,send() 方法的参数为要发送的数据

      

xhr.open('GET', 'example.php', false);
xhr.send(null);

接收响应:

    一个完整的 HTTP 响应由状态码、响应头集合和响应主题组成,在收到响应后,这些都可以通过 XHR 对象的属性和方法使用,主要有以下 4 个属性:

  

responseText : 作为响应主体被返回的文本(文本形式)
responseXML: 如果响应的内同类型是 “text/xml” 或者 “application/xml”,这个属性中将保存着响应数据的 XML ,DOM文档(document形式)
status:HTTP 状态码(数字形式)
statusText:HTTP状态说明(文本形式)

  在所接收响应后,第一步是检查 status 属性,以确定响应已经成功返回。一般来说,可以将 HTTP 状态码为200最为成功的标志。此时,responseText 属性的内容已经就绪,而且在内容类型正确的情况下,responseXML 也可以访问了,此外,状态码为 304 表示请求的资源并没有被修改,可以直接使用浏览器中缓存的版本;当然,也意味着响应是有效的

  无论内容类型是什么,响应主体的内容都会保存到responseText 属性中,而对于 XML 数据而言,responseXML 属性的值将为 null

if(xhr.status >=  && xhr.status == ){
alert(xhr.responseTEXT);
}else{
alert("request was unsuccessful:"+ xhr.status);
}

同步:

  如果接收的是同步的响应,则需要将 open() 方法的第三个参数设置为 false,那么 send() 方法将阻塞直到请求完成,一旦 send() 方法返回,仅需要奸臣 XHR 对象的 status 和 responseText 属性即可

  同步请求是吸引人的,但应该避免使用他们,客户端 javascriot 是单线程的,当 send() 方法阻塞时,它通常会导致整个浏览器 UI 冻结,如果连接的服务器响应慢,那么用户的浏览器将冻结

<button id="btn">获取信息</button>
<div id="result"></div>
<script>
btn.onclick = function(){
//创建xhr对象
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//发送请求
xhr.open('get','/uploads/rs/26/ddzmgynp/message.xml',false);
xhr.send();
//同步接受响应
if(xhr.readyState == ){
if(xhr.status == ){
//实际操作
result.innerHTML += xhr.responseText;
}
}
}
</script>

异步:

  如果需要接收的时异步请求,这就需要检测 XHR 对象的readyStatus 属性,该属性表示请求/响应过程的当前活动阶段,这个属性可取的值如下:

  

(UNSEND):未初始化,尚未调用 open() 方法
(OPENED):启动,已经调用 open()方法,但尚且 send() 方法
(HEADERS_RECEIVED):发送,已经调用dend() 方法,且接收到头信息
(LOADING):接收,已经接收到部分响应主体信息
(DONE):完成,已经接收到全部响应数据,二七五已经可以客户端使用了

  理论上,只要 readyStatus 属性值有一个值编程另外一个值,都会触发一次 readyStatusChange事件。可以利用这个时间检测每次状态变化后 readyStatus 的值。通常,我们对 readyStatus 的值为4 的阶段甘心去,应为着意味着所哟数据都已经就绪

  注意:
    必须在调用 open() 之前指定 onreadyStatuschange 时间处理程序才能确保浏览器兼容性,否则将无法接收 readyStatus 属性为 0 和 1 的情况

xhr.onreadystatechange = function(){
if(xhr.readyState === ){
if(xhr.status == ){
alert(xhr.responseText);
}
}
}
<button id="btn">获取信息</button>
<div id="result"></div>
<script>
btn.onclick = function(){
//创建xhr对象
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//异步接受响应
xhr.onreadystatechange = function(){
if(xhr.readyState == ){
if(xhr.status == ){
//实际操作
result.innerHTML += xhr.responseText;
}
}
}
//发送请求
xhr.open('get','message.xml',true);
xhr.send();
}
</script>

超时:

  XHR对象的 timeout 属性等于一个整数,表示多少毫秒后,如果请求仍然没有得到结果,就会自动终止,该属性默认等于 0, 表示没有时间限制

  如果请求超时, 将触发 ontimeout 事件

  注意:

     IE8 浏览器不支持该属性

  

xhr.open("post", 'test.php', true)
xhr.ontimeout = function(){
console.log("The request timeed out !!! ")
} xhr.timeout = ,
xhr.send();

优化:

   使用Ajax 接收数据时,由于网络和数据大小的原因,并不时立刻就可以在页面中显示出来,所以,更好的做法是,在接收数据的过程中,显示一个类似 loading 的小图片,并且禁用按钮,当数据完全接收后,在隐藏给图片,并开启按钮:

<button id="btn">获取信息</button>
<img id="img" height="" style="display:none" src="data:image/gif;base64,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" alt="loading">
<div id="result"></div>
<script>
var add = (function(){
var counter = ;
return function(){
return ++counter;
}
})();
btn.onclick = function(){
img.style.display = 'inline-block';
btn.setAttribute('disabled','');
//创建xhr对象
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//异步接受响应
xhr.onreadystatechange = function(){
if(xhr.readyState == ){
if(xhr.status == ){
img.style.display = 'none';
btn.removeAttribute('disabled');
var data = JSON.parse(xhr.responseText);
var sum = add() - ;
if(sum < data.length){
result.innerHTML += data[sum];
}
}
}
}
//发送请求
xhr.open('get','data.php',true);
xhr.send();
}
</script>

  Ajax 前端本身的内容并不难,但是,由于Ajax 涉及到一些后端及网络的只是,使得学起来不是很容易。

本文摘自:https://www.cnblogs.com/xiaohuochai/p/6036475.html

  

   

  

  

深入理解 ajax系列第一篇(XHR 对象)的更多相关文章

  1. 深入理解ajax系列第一篇——XHR对象

    × 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...

  2. 深入理解javascript对象系列第一篇——初识对象

    × 目录 [1]定义 [2]创建 [3]组成[4]引用[5]方法 前面的话 javascript中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初 ...

  3. 深入理解ajax系列第二篇——请求方式

    前面的话 在上一篇中,概要地介绍了XHR对象的使用.本文将详细介绍使用XHR对象发送请求的两种方式——GET和POST.下面将以实例的形式来详细说明 GET GET是最常见的请求类型,最常用于向服务器 ...

  4. 深入理解ajax系列第二篇

    前面的话 在上一篇中,概要地介绍了XHR对象的使用.本文将详细介绍使用XHR对象发送请求的两种方式——GET和POST.下面将以实例的形式来详细说明 GET GET是最常见的请求类型,最常用于向服务器 ...

  5. 深入理解ajax系列第九篇——jQuery中的ajax

    前面的话 jQuery提供了一些日常开发中需要的快捷操作,例如load.ajax.get和post等,使用jQuery开发ajax将变得极其简单.这样开发人员就可以将程序开发集中在业务和用户体验上,而 ...

  6. 深入理解ajax系列第九篇

    前面的话 jQuery提供了一些日常开发中需要的快捷操作,例如load.ajax.get和post等,使用jQuery开发ajax将变得极其简单.这样开发人员就可以将程序开发集中在业务和用户体验上,而 ...

  7. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  8. 深入理解javascript函数系列第一篇——函数概述

    × 目录 [1]定义 [2]返回值 [3]调用 前面的话 函数对任何一门语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即 ...

  9. 深入理解javascript函数系列第一篇

    前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...

随机推荐

  1. v:bind指令对于传boolean值的注意之处

    1,

  2. Linux - gitlab的命令

    启动 sudo gitlab-ctl start 关闭 sudo gitlab-ctl stop 重新加载配置文件 sudo gitlab-ctl reconfigure 在本地初始化一个本地仓库 g ...

  3. snowflake 雪花算法 分布式实现全局id生成

    snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID. 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案 ...

  4. 每天进步一点点------Altium Designer集成库简介及创建

    一.集成库概述    Altium Designer 采用了集成库的概念.在集成库中的元件不仅具有原理图中代表元件的符号,还集成了相应的功能模块.如Foot Print 封装,电路仿真模块,信号完整性 ...

  5. xampp 配置多域名工程 解决 Access forbidden!

    XAMPP虚拟主机配置,多域名绑定访问本地站点 XAMPP有时候你需要一些顶级域名访问方式来访问你本地的项目也就是虚拟主机配置,这时候就需要配置虚拟主机,给你的目录绑定一个域名,实现多域名绑定访问. ...

  6. DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL 未能在“xmlhttpRequest”上执行“open”:无效的URL。

    出现这个报错主要是baseurl:http://192.168.*.*/后面的(/)或是请求里面的url:/user/login中前面的(/)有一个漏掉了,导致合成的路径不完整,所以报错:无效的URL

  7. hadoop学习笔记(四):HDFS文件权限,安全模式,以及整体注意点总结

    本文原创,转载注明作者和原文链接! 一:总结注意点: 到现在为止学习到的角色:三个NameNode.SecondaryNameNode.DataNode 1.存储的是每一个文件分割存储之后的元数据信息 ...

  8. JavaMail实现带附件的收发邮件

    一.前言 参考博客: http://blog.csdn.net/xietansheng/article/details/51722660 http://www.cnblogs.com/HigginCu ...

  9. ajax请求无法下载文件的原因

    原因: Ajax下载文件的这种方式本来就是禁止的.出于安全因素的考虑,javascript是不能够保存文件到本地的, 所以ajax考虑到了这点,只是接受json,text,html,xml格式的返回值 ...

  10. socket udp编程的一些积累的记录

    接了个小活,要求写udp的客户端,循环接收服务端的固定的指令并显示数据 我设计的逻辑是,用户在界面输入框输入服务器ip.端口,随后udp连接,开启线程循环接收,接收指令,解析成数据,存在结构体的lis ...