通過本例,可以大概瞭解AJAX訪問伺服器的過程以及基本方法,本例結合DOM動態建立表的行
基本思路:定時間內向伺服器請求資料,伺服器將返回不同的資料資訊(其中以XML格式返回),
AJAX擷取伺服器返回的資訊後,動態建立表的行,從而形成了動態表的產生。
實現如下:
(1)用戶端代碼:
<HTML>
<HEAD>
<Title>sx.asp</Title>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<META name="Generator" content="Asp Studio 1.0">
<script language="javascript">
var xmlHttp;
//建立XMLHTTPRequest對象
function createXMLHttpRequest()
{
var xp;
try{
if(window.ActiveXObject)
{
xp=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
xp=new XMLHTTPRequest();
}
}
catch(e)
{
alert("err!");
}
return xp;
}
//啟動發送請求
function doStart()
{
xmlHttp=createXMLHttpRequest();
var url="server/doPost.asp?type=start";
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=startCallback;
xmlHttp.send(null);
}
//startCallback方法
function startCallback()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
setTimeout("pollServer()",5000);
refreshTime();
}
}
}
//pollServer()方法
function pollServer()
{
xmlHttp=createXMLHttpRequest();
var url="server/doPost.asp?type=chance";
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=pollCallback;
xmlHttp.send(null);
}
//pollCallback方法
function pollCallback()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
var xmlDoc=xmlHttp.responseXML;
var message=xmlDoc.getElementsByTagName("message")[0].firstChild.data;
if(message!="end")
{
var new_row=createRow(message);
var table=document.getElementById("myTable");
var table_body=table.getElementsByTagName("tbody").item(0);
var first_row=table_body.getElementsByTagName("tr").item(0);
table_body.insertBefore(new_row,first_row);
setTimeout("pollServer()",5000);
refreshTime();
}
}
}
}
//refreshTime方法
function refreshTime()
{
var time_span=document.getElementById("time");
var time_val=time_span.innerHTML;
var int_val=parseInt(time_val);
var new_int_val=int_val-1;
if(new_int_val>-1)
{
setTimeout("refreshTime()",1000);
time_span.innerHTML=new_int_val;
}else
{
time_span.innerHTML=5;
}
}
//建立表的行
function createRow(message)
{
var row=document.createElement("tr");
var cell=document.createElement("td");
var cell_data=document.createTextNode(message);
cell.appendChild(cell_data);
row.appendChild(cell);
return row;
}
</script>
</HEAD>
<BODY onLoad="doStart()">
<span id="time" style='display=none' >5</span>
</p>
<table id="myTable" align="center">
<tbody>
<tr id="row_0">
<td></td>
</tr>
</tbody>
</table>
</BODY>
</HTML>
(2)服務端代碼(本例為了測試,所以用ASP,當然PHP、ASP.NET、JSP等都是一個道理)
<%
rem 必須設定成"text/xml"
Response.CharSet="gb2312"
Response.ContentType="text/xml"
%>
<%
dim types
dim res
dim message
dim counter:counter=1
if(session("counter")="") then session("counter")=0
types=replace(Trim(Request.QueryString("type")),"'","")
counter=session("counter")
if types="start" then
counter=1
end if
select case counter
case 1:message="姓名:莫小明,學號:20032564,性別:男,年齡:25歲,籍貫:廣西"
case 2:message="姓名:劉德華,學號:20062564,性別:男,年齡:44歲,籍貫:香港"
case 3:message="姓名:黎 明,學號:16588587,性別:男,年齡:36歲,籍貫:重慶"
case 4:message="姓名:張三 5,學號:20062564,性別:女,年齡:29歲,籍貫:重慶"
case 5:message="姓名:張三 6,學號:20062564,性別:男,年齡:24歲,籍貫:重慶"
case 6:message="姓名:張三 7,學號:20062564,性別:女,年齡:18歲,籍貫:重慶"
case 7:message="end"
case else
message="end"
end select
session("counter")=session("counter")+1
res="<message>"+message+"</message>"
Response.Write("<response>"+res+"</response>")
%>