Ajax异步回调机制

什么是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...
}
}
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值