初识Ajax

本节要点:

  • 什么是Ajax
  • XMLHttpRequest对象
  • 创建Ajax的过程

 

1         什么是AJAX

AJAX是Asynchronous JavaScript  And XML的缩写,但是,很多被认为是“Ajax”的页面并没有使用JavaScript或xml,所以把Ajax定义为一种构建Web页面的方法,使页面像桌面应用一样具有响应性和交互性,这种说法更合适。AJAX的主要用途是使用JavaScript从服务器获取数据而不必刷新整个页面。其中AJAX拆分开来解释:

  • Asynchronous:发送请求后不等返回结果,由回调函数处理结果
  • JavaScript:向服务器发起请求,获得返回结果,更新页面
  • XML:封装数据

2         XMLHttpRequest对象

XMLHttpRequest是整个Ajax技术的灵魂。可以说没有XMLHttpRequest,就没有Ajax。Ajax技术的核心是异步发送请求,而XMLHttpRequest则是异步发送请求的对象。

XMLHttpRequest对象不是一个国际标准。在不同浏览器中有不同的实现。要实现能够跨越浏览器运行的Ajax应用,必须考虑所有的使用场合。使用时必须根据浏览器采用不同的语法进行创建。但对每一个都进行判断不合实际,可以利用JavaScript的异常处理机制实现跨浏览器的XMLHttpRequest对象创建脚本。

示例:

var xmlhttp;

//IE浏览器

try{

     xmlhttp= new ActiveXObject('Msxml2.XMLHTTP');

}catch(e){

      try{

                        xmlhttp= new ActiveXObject('Microsoft.XMLHTTP');

      }catch(e){

              try{

                       //DOM 2浏览器

                       xmlhttp= new XMLHttpRequest();

              }catch(e){}

      }

 

3         创建Ajax的过程

3.1       构建Ajax应用

利用XMLHttpRequest(XHR)对象,每次构建Ajax应用必须遵循以下步骤:

  • 创建XMLHttpRequest对象
  • 创建Ajax请求
  • 发送Ajax请求
  • 处理服务器响应

创建完XMLHttpRequest对象后就可 以开始使用它了。首先介绍open()方法,它创建一个请求,并准备向服务器发送,open方法语法如下:

open(method , url , asynchronous , user , password);

其中的参数含义如下:

  • method:指定请求的类型,一般为get或post;
  • url:指定请求的地址,可以使用绝对地址或相对地址,可以附带查询字符串
  • asynchronous:可选参数,标识请求是同步还是异步,异步请求为true,同步请求为false,默认情况下该参数为true;
  • user:可选参数,指定请求的用户名,没有则省略;
  • password:可选参数, 指定请求的密码,没有则省略;

示例:创建一个请求,利用get方式发送,服务器url为“my.do”

xmlhttp.open(“get”, “my.do”);

 

3.2       发送Ajax请求

在创建一个请求以后,可以使用send()方法向服务器发送这个请求,同时发送数据。其原型如下:

send(body);

该方法仅有一个body参数,它标识要向服务器发送的数据,其格式为查询字符串的形式。

示例:

var body = “userName=qiyi&sex=male&age=25”;

xmlhttp.send(body);

3.3       捕获请求的状态变化

在发送请求后,往往无法知道请求什么时候完成,所以必须利用事件机制捕获请求的状态,XMLHttpRequest对象提供了onreadystatechange事件实现这一功能。 onreadystatechange事件可以指定一个事件处理函数来处理XMLHttpRequest对象的执行结果。 在调用open方法与send方法时都会触发onreadystatechange事件。

示例:

xmlhttp.onreadystatechange=function(){  

//事件处理代码

}

3.4       readyState状态值

onreadystatechange事件是在readyState属性方法改变时触发,readyState的值表示了当前请求的状态,在事件处理程序中可以根据这个值进行不同的处理,下表介绍了每个值的含义。

readyState

含义

0

表示对象已经建立,但还未初始化。

1

当调用open()方法后,readyState=1,表示XMLHttpRequest对象已经被初始化

2

当调用send()方法后,XHR在向服务器发送请求的这段时间内,readyState =2

3

当调用send()方法后,服务器成功接收到所有请求后,readyState = 3

4

表示已经成功接收到来自服务器的响应数据。

使用readyState属性判断请求状态

在整个请求过程中,onreadystatechange事件在每一次readyState值发生改变时都会被触发。通常在事件中判断readyState的值是在请求完成时才做处理。

xmlhttp.onreadystatechange=function(){

         if(xmlhttp.readState ==4){

         //对服务器响应数据进行处理

         }

}

3.5       使用status属性判断请求的结果

status存储服务器端返回的HTTP响应代码,它代表请求的处理结果,下表列出了常见的响应代码的含义:

Http状态码

含义

200

请求成功

202

请求被接收,但处理未完成

400

错误的请求

404

请求资源未找到

500

内部服务器错误

在请求已经完成的情况下,可以使用status判断请求的结果,其中,404错误是最常见的错误代码,代表“请求资源未找到”。在Ajax的开发中,最常用的是200这个响应代码,例如在浏览器成功打开了一个网页,这时HTTP相应代码就是200,但这个代码一般不会显示。

xmlhttp.onreadystatechange=function(){

         if(xmlhttp.readState ==4){

                   if(xmlhttp.status ==200){

                            //请求成功完成

                   }

                   else{

                            //网络失败或者服务器错误

                   }

         }

}

XHR对象可以接收服务器返回的文本片段和XML文档,分别保存在responseText与responseXML属性中。

3.6       获得返回文本

1)        使用responseText获得返回的文本

当服务器端处理了请求并返回后,可以利用XMLHttpRequest对象的responseText属性获取返回的文本片段。

//定义XMLHttpRequest对象的事件处理程序

xmlhttp.onreadystatechange=function(){      

         if(xmlhttp.readyState==4){

                   if(xmlhttp.status==200){

                            //捕捉文本                                                              alert(xmlhttp.responseText);

                   }else{

                            alert(xmlhttp.status);

                   }

         }

}

2)        使用responseXML捕捉XML文档

除responseText属性外,还可以用responseXML属性来获取服务器返回的XML文档。在使用responseText属性获取返回的纯文本时,服务器端无需特殊的操作。

如果服务器返回的是XML文档,必须要求响应体的HTTP头信息中“content-type”属性为“text/xml”。

假如服务器返回以下XML文档

<?xml version="1.0" encoding="UTF-8">

<root>

<title>这是服务器返回的XML数据</title>

</root>

 

//将服务器返回的XML打印在屏幕上。

xmlhttp.onreadystatechange=function(){

     if(xmlhttp.readyState==4){

         if(xmlhttp.status==200){

         //获取xml对象

         var xmlObj=xmlhttp.responseXML;

         //获取第一个title标记内容

         var title=xmlObj.getElementsByTagName("title")[0].text;

         //输出信息

         alert("XML:\n" + xmlObj.xml + "\n" + "第一个title标记内容为:" + title);

          }else{

         alert(xmlhttp.status);

          }

      }

}

 

posted @ 2017-08-30 08:40  silvan_happy  阅读(208)  评论(0编辑  收藏  举报