随笔 - 113  文章 - 0  评论 - 85  阅读 - 54万

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...
}
}
}

 

 

 

 

 

 

posted on   林枫山  阅读(6145)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2010年8月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示