◆ AJAX
 

文╱Arnold Wu武曉佳/CACT/資訊

   

 

   在幾個月前我接觸了比較流行的WEB開發應用技術中的Ajax,Ajax全稱為“Asynchronous JavaScript and XML”(異步javaScript XML),這是一種創建交互式網頁應用的網頁開發技術。

 在傳統的WEB應用中,當客戶端提交表單數據時就會向WEB伺服器發送一個請求,此時客戶端刷新頁面,等待伺服器的響應。伺服器接收並處理傳來的表單,然後返回給客戶端一個新的頁面。這種做法浪費了許多帶寬,因為有可能前後兩個頁面中的大部份數(HTML代碼)是相同的。這也導致用戶界面的響應比本地應用慢的多。而Ajax應用可以僅向伺服器發送並取回必需的數據,並在客戶端採用JavaScript處理來自伺服器的數據。因此在伺服器與客戶端之間交換的數據大量減少,在客戶端看到的是響應更快的應用。

 關於Ajax的使用方法和工作原理在很多網站都有詳細的介紹,可以去網上搜索一下,在下面我給出一個應用的實例附加簡單介紹,然後再探討一下Ajax中的兩個請求方式:GET、POST,因為在選擇不同的請求方式時,如果選擇錯了,有可能造成意想不到的結果。

  try{
   request = new XMLHttpRequest();
}catch(trymicrosoft){
    try{
       request = new ActiveXObject("MSxml2.XMLHTTP")
    }catch(otherMS){
       try{
         request = new ActiveXObject("microsoft.XMLHTTP")
       }catch(failed){
         request = false
       }
    }
}
 

 要使用Ajax,首先我們需要用JavaScript來創建XMLHttpRequest類,但是因為要支持不同的瀏覽器,也要考濾瀏覽器不支持Ajax的情況。所以用到了try和catch的語句塊。Ajax支持的客 戶端瀏覽器有:Mozilla、Firefox、Internet Explorer、Opera、Konqueror 及 Safari。在 Mozilla 、Safari等瀏覽器中我們用request = new XMLHttpRequest();在Internet Explorer中我們用request = new ActiveXObject("MSxml2.XMLHTTP"),為在兼容不同版本的Internet Explorer中使用,我們還需加入request = new ActiveXObject("microsoft.XMLHTTP")的語句。創建好對像後,我們就可以利用創建的對像進行編寫發送和接收數據的代碼了。

function update_Content(){
   if(request.readyState==4){
      if(request.status==200){
        request.responseText//添加代碼 ,處理伺服器傳回的數據
      }else{
        alert("服務器正忙,請重試")
      }
   }
}

function post_arg(){
   arg = “n=1”;
   url=”http://www.act-cn.com/index.php”;
   request.open("POST",url,true);
   request.onreadystatechange = update_Content;
   request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   request.send(arg);
}
 

function get_arg(){
   url=”http://www.act-cn.com/index.php?n=1”;
   request.open('GET', url, true);
   request.onreadystatechange = update_Content;
   request.send(null);
}

 在post_arg()和get_arg()兩個函數中,是要傳遞參數給伺服器的,此函數中url參數是指定伺服器端處理數據的頁面地址,request.onreadystatechange 後邊的update_Content則是指定伺服器響應時執行的函數,但是要注意在這?update_Content後邊一定不要加“( )”。在update_Content()函數中 request.responseText 就是伺服器返回的數據,我們可以任意的去處理返回的數據。討論到這?,我們應該也很關心伺服器是怎麼返回數據的,返回的數據到底是什麼呢。舉個例子,接著上邊的代碼環境。在伺服器端的index.php文件中代碼如下:

<?php
echo “you pass a value is ”.$_GET[“n”];//or $_POST[“n”];
?>

 那麼request.responseText獲得的就是“ you pass a value is 1”。好像有點SOAP的味道了。再回頭看一下post_arg()和get_arg()兩個函數,這兩個函數功能一樣,但是結果有可能不會是我們想要的。舉個例子,還是在上述的環境中,index.php是一個把數據處理後插入或刪除數據庫的數據,然後再返回數據庫中的數據。假設經過此頁面的數據處理後,返回的數據均不一樣,此時我們用GET方式去執行。第一次執行結果沒有什麼錯誤,index正確的處理了數據並返回了我們想要的數據,而第二次再去執行時,注意!返回的結果和第一次是一樣的。並且index.php都沒有第二次的執行。程式發現要傳送的數據和伺服器地址一樣,就把剛剛返回的數據再調出來返囬回,並沒有真正的傳遞給伺服器。這並不是我們的想要的結果,哪?出了錯嗎?沒有,不是我們的錯,也許這就是GET方式的特點吧。而此時我們換用POST傳送方式時,就不會出現這種意想不到的結果。

   
  [回上層目錄]
  除商業用途,歡迎轉載。
轉載時請勿更改、刪減、或增加任何文字;並請註明出處。
以上文字或圖片若有侵害到任何人的權益,請來信至dcc@act-ioi.com.tw