什么是Ajax?   

 

Ajax即"Asynchronous javascript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的Web开发技术。

主要包含了以下几种技术:

        .基于web标准(standards-based presentation)XHTML+CSS的表示;

        .使用 DOM(Document Object Model)进行动态显示及交互;

        .使用 XML 和 XSLT 进行数据交换及相关操作;

        .使用 XMLHttpRequest 进行异步数据查询、检索;

        .使用 JavaScript 将所有的东西绑定在一起。

 

Ajax的两项强大性能:

        .无需重新装载整个页面便能向服务器发送请求。            

        .对XML文档的解析和处理。

 

步骤 1 – "请!" --- 如何发送一个HTTP请求

 

(1)为了用JavaScript向服务器发送一个HTTP请求, 需要一个具备这种功能的类实例. 这样的类首先由Internet Explorer以ActiveX对象引入, 被称为XMLHTTP

后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软的ActiveX对象所提供的方法和属性。

 

因此, 为了创建一个跨浏览器的这样的类实例(对象), 可以应用如下代码:

    

if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
}

(上例对代码做了一定简化,这是为了解释如何创建XMLHTTP类实例. 实际的代码实例可参阅本篇步骤3.)

 

(2)如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作。 为了解决这个问题, 如果服务器响应的header不是text/xml,

可以调用其它方法修改该header。

 

http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');

 

 (3)接下来要决定当收到服务器的响应后,需要做什么。这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应。

可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:

 

http_request.onreadystatechange = nameOfTheFunction;

 注意:在函数名后没有括号,也无需传递参数.另外还有一种方法,可以定义函数及其对响应要采取的行为,如下所示: 

 

http_request.onreadystatechange = function(){
// do the thing
};

 

(4)在定义了如何处理响应后,就要发送请求了.可以调用HTTP请求类的open()send()方法, 如下所示:

 

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

.open()的第一个参数是HTTP请求方式 – GET, POST, HEAD 或任何服务器所支持的您想调用的方式。

按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。

.第二个参数是请求页面的URL。由于自身安全特性的限制,该页面不能为第三方域名的页面。同时一定要保证在所有的页面中都使用准确的域名,

否则调用open()会得到"permission denied"的错误提示。一个常见的错误是访问站点时使用domain.tld,而当请求页面时,却使用www.domain.tld

.第三个参数设置请求是否为异步模式。如果是TRUE, JavaScript函数将继续执行,而不等待服务器响应。这就是"AJAX"中的"A"。

 

如果第一个参数是"POST",send()方法的参数可以是任何想送给服务器的数据。 这时数据要以字符串的形式送给服务器,如下所示:

 

name=value&anothername=othervalue&so=on

 如果第一个参数是”GET”,send()方法的参数为null。

 

步骤 2 – "收到!" --- 处理服务器的响应

 

当发送请求时,要提供指定处理响应的JavaScript函数名。

 

http_request.onreadystatechange = nameOfTheFunction;

 

 

(1)我们来看看这个函数的功能是什么。首先函数会检查请求的状态。如果状态值是4,就意味着一个完整的服务器响应已经收到了,您将可以处理该响应。

 

if (http_request.readyState == 4) {
// everything is good, the response is received
} else {
// still not ready
}

readyState的取值如下:

0(未初始化)  1(正在装载)  2(装载完毕)  3(交互中)  4(完成)

 

(2)接着,函数会检查HTTP服务器响应的状态值。我们着重看值为200 OK的响应。

 

if (http_request.status == 200) {
// perfect!
} else {
// there was a problem with the request,
// for example the response may be a 404 (Not Found)
// or 500 (Internal Server Error) response codes
}

 

 

(3)在检查完请求的状态值和响应的HTTP状态值后, 您就可以处理从服务器得到的数据了。有两种方式可以得到这些数据:

          .http_request.responseText – 以文本字符串的方式返回服务器的响应

          .http_request.responseXML – 以XMLDocument对象方式返回响应。处理XMLDocument对象可以用JavaScript DOM函数

 

步骤 3 – "万事俱备!" - 简单实例

 

附一个简单完整的异步回调函数makeRequest(url, functionName, httpType, sendData):

 

//AJAX的POST请求
//定义XMLHttpRequest对象实例
var http_request = false;
/*************************************************************************
* 方法说明:可复用的http请求发送函数
* 参数说明:
* url:目标URL
* functionName:要回调的函数
* httpType:请求方式(GET/POST)
* sendData:用POST方式发出请求时想传给服务器的数据, 
*       数据以查询字串的方式列出,如:name=value&anothername=othervalue。 
*       若用GET方式:请传null 
*************************************************************************/ 
function makeRequest(url, functionName, httpType, sendData) {

    http_request = false;
if (!httpType) httpType = "GET";

if (window.XMLHttpRequest) { // Non-IE...
        http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

if (!http_request) {
        alert('Cannot send an XMLHTTP request');
return false;
    }

    http_request.onreadystatechange = functionName;
    http_request.open(httpType, url, true);
    http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    http_request.send(sendData);
}

 

(1)我们现在将整个过程完整地做一次,发送一个HTTP请求。我们在客户端OrderDelivery.js用JavaScript请求一个OrderDelivery.ashx服务器文件

 

function EnterProductBarCode(orderGoodsId,orderNumber){
   ......
var requestUrl="../JavaScript/OrderDelivery.ashx?function=EnterProductBarCode&OrderGoodsID="+orderGoodsId+"&OrderNumber="+orderNumber+"&ProductBarCode="+productBarCode;
    makeRequest(requestUrl,EnterProductBarCodeBack,"POST",null);
}

 

(2)OrderDelivery.ashx收到requestUrl, 并根据function参数的值,执行相应的函数。执行完毕,返回数据给客户端的回调函数。

 

public void ProcessRequest (HttpContext context) {
string function = context.Request.Params["function"];
try{
if (function == "EnterProductBarCode"){
            context.Response.Write(...这里返回数据给客户端的回调函数...);
return;
        }
if(...){......}
    }
catch (Exception e)
    {
        context.Response.Write(e.Message);
    } 
}

 

(3)客户端OrderDelivery.js的回调函数EnterProductBarCodeBack使用http_request.responseText获取服务器端返回的数据。并进行处理。

 

function EnterProductBarCodeBack(){
var str=http_request.responseText;
if (http_request.readyState == 4) {
if (http_request.status == 200) {
            ...处理str...
        }
    }
}