Ajxa局部刷新用于提高用户体验。Ajax技术的核心是XMLHttpRequest对象(简称XHR)

  • XMLHttpRequest对象

XMLHttpRequest对象在ie7及更高版本可以这样申明。

var xhr=new XMLHttpRequest();
  • XHR的用法

发送get请求写法是这样:

xhr.open(“get”,”example”,false);

xhr.send(null);

由于这次请求时同步的,JavaScript代码会等到服务器响应之后再继续执行,在收到响应后,响应的数据会自动填充XHR对象的属性,相关的属性如下:

  1. responseText:作为响应主体返回的文本。
  2. responseXML:如果响应的内容类型是”text/xml”或”application/xml”,这个属性中将保存包含着响应数据的XML DOM文档。
  3. status:响应的HTTP状态。
  4. statusText:HTTP状态的说明。

在接收到响应后,第一步是检查status属性,以确定响应已经成功返回,为确保接收到适当的相应,应该像下面这样写:

xhr.open(“get”,”example.txt”,false);

xhr.send(null);

if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

   alert(xhr.responseText);

}else{

alert(“Request was unsuccessful:”+xhr.status);

}

很多情况下,我们还是要发送异步请求,才能让JavaScript继续执行而不必等待响应,此时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段:

  1. 0:未初始化,未调用open方法。
  2. 1:启动,已经调用open方法,未调用send方法
  3. 2:发送,调用send方法,未接收到响应。
  4. 3:接收,已经接收到部分响应数据
  5. 4:完成

只要readyState属性的值右一个值变成另一个值,都会触发一次readystatechange事件,可以利用这个事件来检测每次状态变化后的readyState的值,通常我们只对readyState值为4的阶段感兴趣,不过必须在调用open之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性。代码如下:

var xhr=createXHR();

xhr.onreadystatechange=function(){

   if(xhr.readyState==4){

     if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

       alert(xhr.responseText);

}else{

  alert(“request was unsuccessful:”+xhr.status);

}

}

};

xhr.open(“get”,”sxample”,true);

xhr.send(null);

以上代码利用DOM0级方法为XHR对象添加了事件处理程序,原因是并非所有浏览器都支持DOM2级方法,与其他事件处理程序不同,这里没有向onreadystatechange事件处理程序中传递event对象;必须通过XHR对象本身确定下一步该怎么做。

在接收到响应之前还可以调用abort()方法来取消异步请求,如下:

xhr.abort();

调用这个方法后,XHR对象会停止触发事件,而且也不再允许访问任何与响应有关的对象属性,在终止请求之后,还应该对XHR对象进行解引用操作,不建议重用XHR对象。

  • HTTP头部信息

每个HTTP请求和响应都会带有相应的头部信息,头部信息有:

  1. Accept:浏览器能够处理的内容类型。
  2. Accept-Charset:浏览器能够现实的字符集。
  3. Accept-Encoding:浏览器能处理的压缩编码。
  4. Accept-Language:浏览器当前设置的语言。
  5. Connection:浏览器与服务器之间的连接类型。
  6. Cookie:当前页面设置的任何Cookie。
  7. Host:发出请求的页面所在的域
  8. Referer:发出请求的页面的URL。
  9. User-Agent:浏览器的用户带来字符串。

虽然不同浏览器实际发送的头部信息会有所不同,但以上列出的基本上是所有浏览器都会发送的,使用setRequestHeader方法可以设置自定义的请求头部信息,这个方法接受两个参数:头部字段的名称和头部字段的值。如:

var xhr=createXHR();

xhr.onreadystatechange=function(){

   if(xhr.readyState==4){

if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

  alert(xhr.responseText);

}else{

  alert(“Request was unsuccessful:”+xhr.status);

}

}

};

xhr.open(“get”,”example.php”,true);

xhr.setRequestHeader(“MyHeader”,”MyValue”);

xhr.send(null);

调用XHR对象的getResponseHeader方法并传入头部字段名称,可以取得相应的响应头部信息,而调用getAllResponseHeaders方法则可以取得一个包含所有头部信息的长字符串。

  • Get请求

Get是最常见的请求类型,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器,使用get请求经常会发送的一个错误就是查询字符串的格式问题,查询字符串中的每个参数名和值都必须使用encodeURIComponent进行编码,然后在放到URL的末尾,而且所有名-值对都必须由&分隔。

  • POST请求

使用频率仅次于get,post请求应该把数据作为请求的主体提交,可以包含非常多的数据,而且格式不限,用过ajax来提交表单要先将Content-Type头部信息设置为application/x-www-form-urlencoded,也就是表单提交时的内容类型。代码如下:

function submitData(){

  var xhr=createXHR();

xhr.onreadystatechange=function(){

if(xhr.readyState==4){

 if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

alert(xhr.responseText);

}else{

alert(xhr.responseText);

}

}

}

};

xhr.open(“post”,postexample.php,true);

xhr.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);

var form=focument.getElementById(“user-info”);

xhr.send(serialize(form));
  • XMLHttpRequest 2级:FormData

FormData为序列化表单以及创建与表单格式相同的数据提供了便利。

var data=new FormData();

data.append(“name”,”Nicholas”);

var data=new FormData(doucument.forms[0])
  • 超时设定

表示请求在等待响应多少毫秒之后就终止,在给定的时间内浏览器还没有接收到响应,那么就会触发timeout事件,进而会调用ontimeout事件出来程序,代码如下:

 var xhr=createXHR();

xhr.onreadystatechange=function(){

  if(xhr.readyState==4){

   try{

      if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

 alert(xhr.responseText);

}else{

alert(“Request was unsuccessful:”+xhr.status);

}

}catch(ex){

}

}

}

xhr.open(“get”,”timeout.php”,true);

xhr.timeout=1000;

xhr.ontimeout=function(){

  alert(“Request did not return in a second”);

};

xhr.send(null);
  • overrideMineType方法

用于重写XHR响应的MIME类型,因为返回响应的MIME类型决定了XHR对象如何处理它,所以提供一种方法能够重写服务器返回的MIME类型是很有用的。例如:

var xhr=createXHR();

xhr.open(“get”,”text.php”,true);

xhr.overrideMineType(“text/xml”);

xhr.send(null);
  • 进度事件
  1. load事件

响应接收完毕后将触发load事件,因此也就没有必要去检查readystate属性了,而onload事件处理程序会接收到一个event对象,其target属性就指向xht对象实例。单并非所有浏览器都为这个事件实现了适当的事件对象。

var xhr=createXHR();

xhr.onload=function(){

  if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

   alert(xhr.responseText);

}else{

  alert(“request was unsuccessful:”+xhr.status);

}

};

xhr.open(“get”,”alrevents.php”,true);

xhr.send(null);
  1. progress事件

这个事件会在浏览器接收新数据期间周期性的触发,而onprogress事件处理程序会接收一个event对象,其target属性是XHR对象,但包含着三个额外的属性:lengthComputable、position和totalSize。LengthComputable是一个表示进度信息是否可用的布尔值,position表示已经接收的字节数,totalSize表示根据Content-Length响应头部确定的预期字节数。

var xhr=createXHR();

xhr.onload=function(event){

  if((xhr.status>=200&&xhr.status<300)||xhr.status==304){

     alert(xhr.responseText);

}else{

  alert(“Request wa unsuccessful:”+xhr.status);

}

};

xhr.onprogress-function(event){

  var divStatus=document.getElementById(“status”);

   if(event.lengthComputable){

   if(event.lengthComputable){

    divStatus.innerHTML=”Received ”+event.position+” of ”+event.totalSize+”bytes”;

}

}

};

xhr.open(“get”,”altevents.php”,true);

xhr.send(null);

原生ajax详解的更多相关文章

  1. $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解

    [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...

  2. Ajax详解及使用Ajax时的返回值类型有哪些?

    Ajax详解 Ajax = 异步 JavaScript 和 XML. Ajax 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在 ...

  3. $.ajax()详解

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  4. jQuery中$.ajax()详解(转)

    JQuery中$.ajax()方法参数详解     url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get) ...

  5. 第三十五课:Ajax详解

    一个完整的Ajax请求: var xhr = new (self.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP");   ...

  6. Ajax 详解及CORS

    Ajax 是什么? Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)是指一种创建交互式网页应用的网页开发技术 ...

  7. Ajax详解

    一:什么是Ajax AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ...

  8. AJAX 详解注释很全来自互联网

    1: //用户名校验的方法 2: //这个方法使用XMLHTTPRequest对象进行AJAX的异步数据交互 3: var xmlhttp; 4: function verify(){ 5: //1. ...

  9. jquery ajax详解

    详细参数列表url:发送请求的连接地址type:请求方式 get:获取 post:发送 put和deletetimeout:设置请求超时时间async:默认true为异步请求,false同步请求锁住浏 ...

随机推荐

  1. 《RDLC部署》RDLC部署到IIS缺少DLL程序集

    1.错误:从vs生成网站部署到服务器后打开RDLC报表却提示缺少DLL程序集. 一般是缺少如下文件 1. Microsoft.ReportViewer.Common.dll 2.   Microsof ...

  2. IE6浏览器常见的bug及其修复方法

    IE6不支持min-height,解决办法使用css hack: .target { min-height: 100px; height: auto !important; height: 100px ...

  3. C# vs TypeScript - 高级类型

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  4. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET

    译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...

  5. GCD 多线程 ---的记录 iOS

    先写一个GCD static UserInfoVoModel *userInfoShare = nil; +(instancetype)shareUserInfoVoModel { static di ...

  6. matlab中使用elseif和if嵌套的对比

    % 目标: % 判定成绩等级 %定义变量 % 输入:分数grade %清除变量或指令 clc; % 允许用户输入参数 disp ('该功能练习if语句'); disp ('输入你的成绩,系统将判定等级 ...

  7. java-7继承

    请自行编写代码测试以下特性(动手动脑):在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. public class QWE {    public void main(String[] ...

  8. jQuery动态生成不规则表格前后端

    一.需求:有这么一张表 前四个属性当作联合主键 需要把该表所有的行在前端以表格形式显示出来,要求activityId相同时合并成一行,activityCode相同时,合并一行,activityVers ...

  9. Entity Framework Code First约定

    Code First使你能够通过C# 或者 Visual Basic .NET来描述模型,模型的基本规则通过使用约定来进行检查,而约定就是一系列内置的规则. 在Code First中基于类的定义通过一 ...

  10. AMD的cpu如何安装Mac OS

    AMD的cpu如何安装Mac OS       经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验.      为了安装方便,有不影响原来的系统的使用 ...