Ajax基础(2)

来源:互联网 发布:希捷同步软件 编辑:程序博客网 时间:2024/06/07 22:46

一、XMLHttpRequest对象

1、XMLHttpRequest是XMLHTTP组件的对象,通过这个对象,AJAX可以像桌面应用程序一样只同服务器进行数据层面的交换,而不用每次都刷新界面,也不用每次将数据处理的工作都交给服务器来做;这样既减轻了服务器负担又加快了响应速度、缩短了用户等待的时间。

2、XMLHttpRequest最早是在IE5中以ActiveX组件的形式实现的。非W3C标准.

3、创建XMLHttpRequest对象(由于非标准所以实现方法不统一)

a、Internet Explorer把XMLHttpRequest实现为一个ActiveX对象b、其他浏览器(Firefox、Safari、Opera…)把它实现为一个本地的JavaScript对象。c、XMLHttpRequest在不同浏览器上的实现是兼容的,所以可以用同样的方式访问XMLHttpRequest实例的属性和方法,而不论这个实例创建的方法是什么。

二、XMLHttpRequest对象初始化

function   createXmlHttpRequest(){   var xmlHttp;   try{    //Firefox, Opera 8.0+, Safari           xmlHttp = new XMLHttpRequest();    }catch (e){           try{    //Internet Explorer                  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");            }catch (e){                  try{                          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");                  }catch (e){}             }    }   return xmlHttp; }

三、XMLHttpRequest对象方法和属性

这里写图片描述

这里写图片描述

实现Ajax的步骤:
这里写图片描述

a、利用XMLHttpRequest 实例与服务器进行通信包含以下3个关键部分:

onreadystatechange 事件处理函数open 方法send 方法 

(1)发送请求–onreadystatechange:

该事件处理函数由服务器触发,而不是用户

在 Ajax 执行过程中,服务器会通知客户端当前的通信状态。这依靠更新 XMLHttpRequest 对象的readyState 来实现。改变 readyState 属性是服务器对客户端连接操作的一种方式。

每次 readyState 属性的改变都会触发 readystatechange事件

(2)发送请求–open(method, url, asynch):

XMLHttpRequest 对象的 open 方法允许程序员用一个Ajax调用向服务器发送请求。

method:请求类型,类似 “GET”或”POST”的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用GET(可以在GET请求里通过附加在URL上的查询字符串来发送数据,不过数据大小限制为2000个字符)。若需要向服务器发送数据,用POST。

url:路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。

asynch:表示请求是否要异步传输,默认值为true(异步)。指定true,在读取后面的脚本之前,不需要等待服务器的相应。指定false,当脚本处理过程经过这点时,会停下来,一直等到Ajax请求执行完毕再继续执行

在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个URL。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到URL的最后,就能确保URL的惟一性,从而避免浏览器缓存结果。

(3)发送请求–send(data):

open 方法定义了 Ajax 请求的一些细节。send 方法可为已经待命的请求发送指令

data:将要传递给服务器的字符串。

若选用的是 GET 请求,则不会发送任何数据, 给 send 方法传递 null 即可:request.send(null);
当向send()方法提供参数时,要确保open()中指定的方法是POST,如果没有数据作为请求体的一部分发送,则使用null.

完整的 Ajax 的 GET 请求示例:
这里写图片描述

(4)发送请求–setRequestHeader(header,value)

当浏览器向服务器请求页面时,它会伴随这个请求发送一组首部信息。这些首部信息是一系列描述请求的元数据(metadata)。首部信息用来声明一个请求是 GET 还是 POST。

Ajax 请求中,发送首部信息的工作可以由 setRequestHeader完成

header: 首部的名字

value:首部的值。

如果用 POST 请求向服务器发送数据,需要将 “Content-type” 的首部设置为 “application/x-www-form-urlencoded”.它会告知服务器正在发送数据,并且数据已经符合URL编码了。

该方法必须在open()之后才能调用

完整的 Ajax 的 POST 请求示例:
这里写图片描述

b、利用 XMLHttpRequest 的方法可向服务器发送请求。在 Ajax 处理过程中,XMLHttpRequest 的如下属性可被服务器更改:

readyStatestatusresponseTextresponseXML

(1)接收请求–readyState

readyState 属性表示Ajax请求的当前状态。它的值用数字代表。

0 代表未初始化。 还没有调用 open 方法1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用2 代表已加载完毕。send 已被调用。请求已经开始3 代表交互中。服务器正在发送响应4 代表完成。响应发送完毕

每次 readyState 值的改变,都会触发 readystatechange 事件。如果把 onreadystatechange 事件处理函数赋给一个函数,那么每次 readyState 值的改变都会引发该函数的执行。

readyState 值的变化会因浏览器的不同而有所差异。但是,当请求结束的时候,每个浏览器都会把 readyState 的值统一设为 4。

(2)接收请求–status

服务器发送的每一个响应也都带有首部信息。三位数的状态码是服务器发送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。

常用状态码及其含义:

404 没找到页面(not found)403 禁止访问(forbidden)500 内部服务器出错(internal service error)200 一切正常(ok)304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )

在 XMLHttpRequest 对象中,服务器发送的状态码都保存在 status 属性里。通过把这个值和 200 或 304 比较,可以确保服务器是否已发送了一个成功的响应

(3)接收请求–responseText

XMLHttpRequest 的 responseText 属性包含了从服务器发送的数据。它是一个HTML,XML或普通文本,这取决于服务器发送的内容。

当 readyState 属性值变成 4 时, responseText 属性才可用,表明 Ajax 请求已经结束。

(4)responseXML

如果服务器返回的是 XML, 那么数据将储存在 responseXML 属性中。

只有服务器发送了带有正确首部信息的数据时, responseXML 属性才是可用的。 MIME 类型必须为 text/xml

改变之后实现Ajax的步骤:
这里写图片描述

        //1.创建XMLHttpRequest对象        var xhr = createXmlHttpRequest();        //4.服务器向浏览器响应请求(注册监听)        xhr.onreadystatechange = function () {            alert(xhr.readyState);            if (xhr.readyState == 4){                if (xhr.status == 200 || xhr.status == 304) {                    var data = xhr.responseText;                    alert(data);                }            }        }        //2.浏览器和服务器建立连接        xhr.open("POST","/test?c="+14,true);        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");        //3.浏览器向服务器发送请求        xhr.send("a=10&b=5");

四、Ajax开发框架

AJAX实质上也是遵循Request/Server模式,所以这个框架基本的流程是:

对象初始化发送请求服务器接收服务器返回客户端接收修改客户端页面内容。

只不过这个过程是异步的。

(1)初始化XMLHttpRequest对象

function   createXmlHttpRequest(){   var xmlHttp;   try{    //Firefox, Opera 8.0+, Safari           xmlHttp=new XMLHttpRequest();    }catch (e){           try{    //Internet Explorer                  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");            }catch (e){                  try{                          xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");                  }catch (e){}             }    }   return xmlHttp; }

(2)指定响应处理函数

指定当服务器返回信息时客户端的处理方式。只要将相应的处理函数名称赋给XMLHttpRequest对象的onreadystatechange属性就可以了.比如:

      XMLHttpReq.onreadystatechange = processResponse;      // 处理返回信息的函数      function   processResponse() {      }

注意:这个函数名称不加括号,不指定参数。也可以用Javascript函数直接量方式定义响应函数。比如:

       XMLHttpReq.onreadystatechange = function() { };

(3)发出HTTP请求

向服务器发出HTTP请求了。这一步调用XMLHttpRequest对象的open和send方法。

  http_request.open('GET', 'http://www.example.org/some.file', true);  http_request.send(null)

按照顺序,open调用完毕之后要调用send方法。send的参数如果是以Post方式发出的话,可以是任何想传给服务器的内容。

注意:如果要传文件或者Post内容给服务器,必须先调用setRequestHeader方法,修改MIME类别。如下:

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

这时只要以查询字符串的形式列出,作为send的参数,例如:

    name=value&anothername=othervalue&so=on

代码:

    //发送请求    function sendRequest(){        //获取文本框的值        var chatMsg=input.value;        var url="chatServlet.do?charMsg="+chatMsg;        //建立对服务器的调用        XMLHttpReq.open("POST",url,true);        //设置MiME类别,如果用 POST 请求向服务器发送数据,        //需要将"Content-type" 的首部设置为 "application/x-www-form-urlencoded".        //它会告知服务器正在发送数据,并且数据已经符合URL编码了。        XMLHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");        //状态改变的事件触发器,客户端的状态改变会触发readystatechange事件,        //onreadystatechange会调用相应的事件处理函数        XMLHttpReq.onreadystatechange=processResponse;        //发送数据        XMLHttpReq.send(null);    }

(4)处理服务器返回的信息

处理响应处理函数都应该做什么。

  首先,它要检查XMLHttpRequest对象的readyState值,判断请求目前的状态。参照前面的属性表可以知道,readyState值为4的时候,代表服务器已经传回所有的信息,可以开始处理信息并更新页面内容了。如下:

if (http_request.readyState == 4) {    // 信息已经返回,可以开始处理} else {    // 信息还没有返回,等待}

  服务器返回信息后,还需要判断返回的HTTP状态码,确定返回的页面没有错误。所有的状态码都可以在W3C的官方网站上查到。其中,200代表页面正常。

if (http_request.status == 200) {      // 页面正常,可以开始处理信息} else {    // 页面有问题}

XMLHttpRequest对成功返回的信息有两种处理方式:

    responseText:将传回的信息当字符串使用;    responseXML:将传回的信息当XML文档使用,可以用DOM处理。 

代码:

//处理返回信息的函数function processResponse(){   if(XMLHttpReq.readyState==4){ //判断对象状态 4代表完成           if(XMLHttpReq.status==200){ //信息已经成功返回,开始处理信息                  document.getElementById("chatArea").value=XMLHttpReq.responseText;          }   }}
原创粉丝点击