理論上說
,Ajax
由
HTML
、
JavaScript
?
技術、
DHTML
和
DOM
組成
.
?
一
,XMLHttpRequest
物件
?
是
ajax
的主要工作對象是
一個完整的聲明一個相容各流覽器的
XMLHttpRequest
的
js
代碼如下
<script?
language
="
javascript
"?
type
="
text/javascript
">
var
?request;
function
?createRequest()?{
try
?{
request?=?new?XMLHttpRequest();
} ?
catch
?(trymicrosoft)?{
try
?{
request?=?new?
ActiveXObject
("
Msxml2.XMLHTTP
");
} ?
catch
?(othermicrosoft)?{
try
?{
request?=?new?
ActiveXObject
("
Microsoft.XMLHTTP
");
} ?
catch
?(failed)?{
request?=?false;
}
}
}
if
?(!request)
alert
("
Error?initializing?XMLHttpRequest!,
此流覽器不支持
");
}
</script>
?
在
ajax
編程中
,
還會常用到的一個語句是
document.getElementById("
phone
").value ,
取得值
調用
request
物件來向伺服器發請求時
,js
代碼如下
,
function
?getCustomerInfo()?{
var
?phone?=?
document
.getElementById("
phone
").value;
var
?url?=?"
getCustomer.asp?phone=
"?+?
escape
(phone);
//getCustomer.asp
為請求的頁面
request.
open
("
GET
",?url,?
true
);?
//
這個地方已將資訊發到緩存
request.onreadystatechange?=?updatePage;
//
這個表示
,
請求發出到伺服器的狀態回饋
,updatePage
事件為自定義錯誤處理
request.send(
null
);
//
發送
}
function
?updatePage()?{
?if?(xmlHttp.readyState?==?1)?
{
document
.getElementById("flag").innerHTML?=?"
正在載入連接物件
......
";
}
if
?(xmlHttp.readyState?==?2)?
{
document
.getElementById("flag").innerHTML?=?"
連接物件載入完畢。
";
}
if
?(xmlHttp.readyState?==?3)? {
document
.getElementById("flag").innerHTML?=?"
資料獲取中
......
";}
if
?(request.
readyState
?==?4)
????? ?
if
?(request.
status
?==?200)
?????
alert
("
Server?is?done!
伺服器已收到
,
");
????
else
?
if
?(request.
status
?==?404)
????
alert
("
Request?URL?does?not?exist,
發送的位址錯了
,
沒有此頁面
");
????
else
?
if
?(request.
status
?==?403)?{
????
alert
("
Access?denied.
無權訪問
");
????
else
????
alert
("
Error:?status?code?is?
"?+?request.
status
);
}
附一
:XMLHttpRequest
物件的
open()
方法來完成。該方法有五個參數
:
XMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
request-type
:
發送請求的類型。典型的值是
GET
或
POST
,
但也可以發送
HEAD
請求。
url
:
要連接的
URL
。
asynch
:
如果希望使用非同步連接則為
true
,
否則為
false
。該參數是可選的,默認為
true
。
username
:如果需要身份驗證,則可以在此指定用戶名。該可選參數沒有預設值。
password
:如果需要身份驗證,則可以在此指定口令。該可選參數沒有預設值。
附二
:
關於
request.readyState
的狀態
,
有
0
:請求沒有發出(在調用
open()
之前)。
1
:請求已經建立但還沒有發出(調用
send()
之前)。
一般用不著這之前
2
:請求已經發出正在處理之中(這裏通常可以從回應得到內容頭部)。
3
:請求已經處理,回應中通常有部分資料可用,但是伺服器還沒有完成回應。
4
:回應已完成,可以訪問伺服器回應並使用它。
?
若請求正常
,
且頁面有反回的輸出資訊時
,
將
updatePage
方法處理再改成
?
function
?
updatePage()?{
if
?
(request.readyState
?
==?4)?{
if
?
(request.status
?
==?200)?{
var
?
response?=?request.responseText.split("|");?? //
切割字串
document
.getElementById("order").value
?
=?response[0];
document
.getElementById("address").innerHTML
?
=response[1].replace(/
\
n
/g,?"");
} ?else
alert
("status?is?"?+?request.status);
}
}
?
?
附三
:
XMLHttpRequest
成員
,
對象
屬性有
onreadystatechange
*
指定當
readyState
屬性改變時的事件處理控制碼。只寫
readyState?
返回當前請求的狀態
,
唯讀
.
responseBody?
將回應資訊正文以
unsigned byte
陣列形式返回
.
唯讀
responseStream
以
Ado Stream
物件的形式返回回應資訊。唯讀
responseText
將回應資訊作為字串返回
.
唯讀
responseXML
將回應資訊格式化為
Xml Document
物件並返回
,
唯讀
status
返回當前請求的
http
狀態碼
.
唯讀
statusText?
返回當前請求的回應行狀態
,
唯讀
方法
abort
取消當前請求
getAllResponseHeaders
獲取回應的所有
http
頭
getResponseHeader
從回應資訊中獲取指定的
http
頭
open
創建一個新的
http
請求
,
並指定此請求的方法、
URL
以及驗證資訊
(
用戶名
/
密碼
)
send
發送請求到
http
伺服器並接收回應
setRequestHeader
單獨指定請求的某個
http
頭
()
事件
無
?
二
, document.createElement("html
標籤
"),
創建頁面元素
取得了值了
,
就要顯示出來了
,
通常都是用
js
動態創建元素
,
插入到當前頁元素了
2.1
在一個
table
表格內增加行內容
,
控制項
var
?
row?=?document.createElement("tr");
row.setAttribute("id",?name);
var
?
cell?=?document.createElement("td");
cell.appendChild(document.createTextNode(name));
row.appendChild(cell);
var
?
deleteButton?=?document.createElement("input");
deleteButton.setAttribute("type",?"button");
deleteButton.setAttribute("value",?"
刪除
");
deleteButton.onclick
?
=?function
?
()?{
deleteSort(name);
} ;
cell?=?document.createElement("td");
cell.appendChild(deleteButton);
row.appendChild(cell);
document
.getElementById("sortList").appendChild(row);
在
html
頁的
table
相應增加行的位置
,
放一句
<tbody id="sortList"></tbody>
2.2
相應的刪除表行
js
如下
:
function
?deleteSort(id)?{
if
?(id!=null){
var
?rowToDelete?=?document.getElementById(id);
var
?sortList?=?document.getElementById("sortList");
sortList.removeChild(rowToDelete);
}
}
2.3
一個完整的讀取標準和
RSS
訂閱
xml
文檔的代碼
<script?language="javascript">
var
?XML_Http_Request?=?false;
function
?createXMLHttpRequest(){
//
創建
XMLHttpRequest
對象
,
XML_Http_Request?=?false;
if
(window.XMLHttpRequest){
//for?Mozilla
?XML_Http_Request?=?new?XMLHttpRequest();
if
(XML_Http_Request.overrideMimeType){
XML_Http_Request.overrideMimeType("text/xml");
}
}
else
?if(window.ActiveXObject){
?//for?IE
try{
XML_Http_Request?=?new?ActiveXObject("Msxml2.XMLHTTP");
} catch(e){
try{
XML_Http_Request?=?new?ActiveXObject("Microsoft.XMLHTTP");
} catch(e){
}
}
}
}
function
?send_Request(url){
//
讀取標準
xml
訂閱
createXMLHttpRequest();
if
(!XML_Http_Request){
window
.alert("Cannot?create?XMLHttpRequest?instance!");
return
?false;
}
XML_Http_Request.onreadystatechange?=?processRequest;
XML_Http_Request.open("GET",url,true);
//true---
非同步
;false---
同步
XML_Http_Request.send(null);
}
function
?processRequest(){
if
(XML_Http_Request.readyState?==?4)?{
if
(XML_Http_Request.status?==?200)?{
/***********************
處理內容部分
*****************************/
//statements??
?var?results?=?XML_Http_Request.responseXML;
var
?title?=?null;
var
?item?=?null;
var
?link?=?null;
var
?description?=?null;
var
?ccc?=?results.getElementsByTagName("channel");
var
?headtitle?=?ccc[0].getElementsByTagName("title")[0].firstChild.nodeValue;
var
?headlink?=?ccc[0].getElementsByTagName("link")[0].firstChild.nodeValue;
var
?cell?=?document.createElement("div");
cell.innerHTML?=?"<h1><a?href="+headlink+"?target=_blank>"+headtitle+"</a></h1><br>";
document
.getElementById("result").appendChild(cell);
var
?items?=?results.getElementsByTagName("item");
for
(var?i?=?0;?i?<?items.length;?i++)?{
item?=?items[i];
link
=item.getElementsByTagName("link")[0].firstChild.nodeValue;
title
?=?item.getElementsByTagName("title")[0].firstChild.nodeValue;
var
?cell?=?document.createElement("div");
cell.innerHTML?=?"<li><a?href="+link+"?target=_blank>"+title+"</a></li><br>";
document
.getElementById("result").appendChild(cell);
}
/*******************************************************************************/
} } }
</script>
</head>
<body?onLoad="javascript:send_Request('http://www.cnblogs.com/jxghost/Rss.aspx');">
<div?id="result"></div>
2.34
利用
XMLHttpRequest
竊取動態網頁的某一部分
(
網頁有規律
).
代碼目標是取得證券交易公司網站的交易報表部分
.
目標頁是
:
http://www.cc168.com.cn/service/FundNetValue.jsp?newEndDate=2006-10-20
這一部分是
jsp
動態生成的
,
正好表頭以
? <td class="info-head" width="400" valign="top">
開始
,
表尾以
</td></tr>
結速
,
<script?language="javascript">
window
.onload?=?function()
{
CreateDateSelect();
}
var
?xmlHttp?=?false;
var
?e; //
創建
XMLHTTP
對象
function
?getXMLHTTPObj()
{
var
?C?=?null;
try
{
C?=?new?ActiveXObject("Msxml2.XMLHTTP");
}
catch
(e) {
try
{
C?=?new?ActiveXObject("Microsoft.XMLHTTP");
}
catch
(sc) {
????? C?=?null;}
}
if
(?!C?&&?typeof?XMLHttpRequest?!=?"undefined"?) { C?=?new?XMLHttpRequest();}
return
?C;
}
//
調用遠程方法
function
?callServer(e)? {
try
{
if
(?xmlHttp?&&?xmlHttp?.readyState?!=?0?) { xmlHttp.abort();}
xmlHttp?=?getXMLHTTPObj();
if
(?xmlHttp?) ?{
document
.getElementById("outgroup").style.display?=?"none";
var
?dateSele?=?e.options[e.selectedIndex].value; //
獲取查詢日期
document
.getElementById("date").innerHTML?=?dateSele?+?"?
開放式基金淨值
";
var
?url?=?"http://www.cc168.com.cn/service/FundNetValue.jsp?newEndDate="?+?dateSele; //
構造查詢連接字串
xmlHttp.open("GET",?url,?true); //
打開連接
xmlHttp.onreadystatechange?=?updatePage; //
設置回調函數
xmlHttp.send(null); //
發送請求
??
}
else
{
document
.getElementById("flag").innerHTML?=?"XMLHTTP
對象創建失敗
";?? }
}
catch
?(e) {
document
.getElementById("flag").innerHTML?=?"
查詢錯誤
:
"?+?e;}
}
//
回調處理函數
function
?updatePage()? {
try
?{
?
if?(xmlHttp.readyState?==?1)?
{
document
.getElementById("flag").innerHTML?=?"
正在載入連接物件
......
";
}
if
?(xmlHttp.readyState?==?2)?
?{
document
.getElementById("flag").innerHTML?=?"
連接物件載入完畢。
";
}
if
?(xmlHttp.readyState?==?3)?
{
document
.getElementById("flag").innerHTML?=?"
資料獲取中
......
";
}
if
?(xmlHttp.readyState?==?4)?
?{?? //
以下切割頁面
,
取得所要的部分
html
代碼
var
?response?=?xmlHttp.responseText;
var
?OpenValue?=?response.split("<td?class=\"info-head\"?width=\"400\"?valign=\"top\">")[1];
var
?OpenValue?=?OpenValue.split("</td></tr>")[0];
//alert(OpenValue);
?document.getElementById("out").innerHTML?=?OpenValue;
var
?OpenValue1?=?response.split("<td?class=\"info-head\"?width=\"400\"?valign=\"top\">")[2];
var
?OpenValue1?=?OpenValue1.split("</td></tr>")[0];
document
.getElementById("out1").innerHTML?=?OpenValue1;
var
?OpenValue2?=?response.split("<td?class=\"info-head\"?width=\"400\"?valign=\"top\">")[3];
var
?OpenValue2?=?OpenValue2.split("</td></tr>")[0];
document
.getElementById("out2").innerHTML?=?OpenValue2;
var
?OpenValue3?=?response.split("<td?class=\"info-head\"?width=\"400\"?valign=\"top\">")[4];
var
?OpenValue3?=?OpenValue3.split("</td></tr>")[0];
document
.getElementById("out3").innerHTML?=?OpenValue3;
document
.getElementById("flag").innerHTML?=?"
查詢結束
";
document
.getElementById("outgroup").style.display?=?""; //
送顯
} }
catch
?(e)? {
document
.getElementById("flag").innerHTML?=?"
回調處理錯誤
:
"?+?e;
} }
//
創建日期選擇下拉清單
function
?CreateDateSelect()
{
var
?html?=?[];
for
(var?iYear=2005;?iYear<=2006;?iYear?++) ?{
for
(?var?iMonth=1;?iMonth<=12;?iMonth?++?) {
for
(?var?iDay=1;?iDay<=31;?iDay?++?) {
html[html.length]?=?"<option?value=\""?+?iYear?+?"\-"?+?iMonth?+?"\-"?+?iDay?+?"\">"?+?iYear?+?"
年
?+?iMonth?+?"
月
"?+?iDay?+?"
日
"?+?"</option>";
} }}
document
.getElementById("dateSele").innerHTML?=?"<select?name=\"dateSele\"?id=\"dateSele\"?onchange
\"callServer(this);\">
"?+?html.join("")?+?"</select>";
} ?
</script>
</head>
<body>
<form>
<div>
請選擇交易日期
:</div>
<div>
<div?id="dateSele"?align=left>
</div>
<div?id="flag"?align=right></div>
</div>
<div?id="date"></div>
<div?id="outgroup"?style="display:None">
?<div?id="out"></div>
<div?id="out1"></div>
<div?id="out2"></div>
<div?id="out3"></div>
</div>
</form>
</body>
DOM
物件是
Ajax
編程的主要操作對象
.
?