Sunspl

Hello,everyone,i am sun. 天道酬勤,笨鳥先飛.
随笔 - 47, 文章 - 0, 评论 - 24, 引用 - 0
数据加载中……

ajax學習(轉發)

理論上說 ,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="outgroupstyle="display:None">
 <div id="out"></div>
<div id="out1"></div>
<div id="out2"></div>
<div id="out3"></div>
</div>
</form>
</body>

DOM 物件是 Ajax 編程的主要操作對象 .

 

posted on 2007-03-06 09:32 JavaSuns 阅读(1002) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: