Ajax 同一頁面如何同時執行多個 XMLHTTP 呢,比如部落格頁,需要同時利用 Ajax 讀取作者資訊、文章資訊、評論資訊……
我們的第一反應可能是建立多個全域 XMLHTTP 對象,但這並不現實。其實實現方式非常簡單,就是給 onreadystatechange 對應的回呼函數加上參數,以下代碼是解決方案中一個函數中的一段代碼。 xmlhttp.open("GET", "ajax_process.aspx?a=" + a, true);
xmlhttp.onreadystatechange = function () { OnReadyStateChng(xmlhttp, a); };
xmlhttp.send(null);
只是改寫 onreadystatechange 的屬性值,這樣就可以為 OnReadyStateChng 函數賦參數了。如是我們寫作 xmlhttp.onreadystatechange = OnReadyStateChng;,那麼 OnReadyStateChng 就不能有參數了,也就無法獲得是哪個 xmlhttp 的響應,也就無法獲得是響應後要對哪個控制項進行設定。
我們可以看一個完整的樣本,前台頁面是普通的 Ajax 技術的 HTML 頁面,後台使用的是 ASP.NET 的 .aspx 檔案,之所以採用 ASP.NET,是為了示範延時處理功能。
前景程式 <?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Ajax Test</title>
</head> <body> <div id="a1">1</div>
<div id="a2">2</div>
<div id="a3">3</div> <script type="text/javascript" language="javascript">
<!--
function CreateHTTPObject()
{
var xmlhttp;
try
{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined')
{
try
{
xmlhttp = new XMLHttpRequest();
}
catch (e)
{
xmlhttp=false;
}
}
if (!xmlhttp && window.createRequest)
{
try
{
xmlhttp = window.createRequest();
}
catch (e)
{
xmlhttp=false;
}
}
return xmlhttp;
}
function OnReadyStateChng(xmlhttp, a)
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200)
{
document.getElementById(a).innerHTML = a;
}
else
{
alert("HTTP 錯誤,狀態代碼:" + xmlhttp.status);
}
}
}
function SubmitMsg( a)
{
var xmlhttp = CreateHTTPObject();
if (!xmlhttp)
{
return; //無法建立 xmlhttp 對象
}
//Ajax 提交
xmlhttp.open("GET", "ajax_process.aspx?a=" + a, true);
xmlhttp.onreadystatechange = function () { OnReadyStateChng(xmlhttp, a); };
xmlhttp.send(null);
} SubmitMsg("a1");
SubmitMsg("a2");
SubmitMsg("a3"); -->
</script> </body> </html>
背景程式 <%@ Page Language="C#" %>
<%Response.Expires = 0; %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["a"] == "a1")
{
System.Threading.Thread.Sleep(3000); //延時 3 秒
}
else if (Request.QueryString["a"] == "a2")
{
System.Threading.Thread.Sleep(1000); //延時 1 秒
}
else if (Request.QueryString["a"] == "a3")
{
System.Threading.Thread.Sleep(2000); //延時 2 秒
}
}
</script> <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Ajax Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
示範解說
前台頁面發出三個非同步回送請求,分別為 a1、a2、a3 請求值,在後台頁面中,通過延時類比處理 a1 需要 3 秒,處理 a2 需要 1 秒,處理 a3 需要 2 秒。通過示範發現最先有變化的是 a2,然後是 a3、a1,順序並沒有亂,也沒有出現顯示混亂的情況。注意後台頁面需要 Response.Expires = 0; 這麼一句代碼指示頁面立即到期,否則重新整理時請求的是緩衝的頁面,示範也就沒有效果了。
另外
每個 xmlhttp 的 onreadystatechange 對應的函數名稱也可以不同,不僅限於參數不同。
http://www.cftea.com/c/2007/09/ZO75JIETY8KK76RZ.asp