1. 程式人生 > >XMLHttpRequest五步學習法

XMLHttpRequest五步學習法

  XMLHttpRequest五部曲

  在上一篇部落格中主要講了一下AJAX的基礎知識,對AJAX進行了一下簡單的講解。既然XMLHttpRequest物件是AJAX的核心技術,那麼這篇部落格將學習如何使用XMLHttpRequest物件,實現非同步操作。下面以驗證表單為例說一下。

  第一部

  建立XMLHttpRequest物件

  由於不同的瀏覽器支援XMLHttpRequest物件的建立方式不同,所以我們建立XMLHttpRequest物件的方式要有選擇性。比如:IE6 、IE5等比較舊版本的IE需要使用ActiveXObject來實現建立,IE中比較高階的版本、firefox 、Opera 等就可以直接使用 new XMLHttpRequest 完成建立。

  JS程式碼:

       //1.建立XMLRequest物件

               if(window.XMLHttpRequest){
                    //IE7,8 fireFox, Opera
                    xmlhttp = newXMLHttpRequest();
                    if(xmlhttp.overrideMimeType){
                       xmlhttp.overrideMimeType("text/xml");
                    }elseif(window.ActioveXObject){

                        //IE 老版本的
                        varactiveName==["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0",

                       "MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML.2.XMLHTTP",

                        "Microsoft.XMLHTTP"];    

                   for(var i; i<activexName.length; i++){
                           try{                    
                                varxmlhttp=new ActiveXObject(activexName[i]);
                               break;
                           }catch(e){                           

                            }
                    }                   
                    }
                }
               if(xmlhttp==nudefind || xmlhttp==null){

                    alert("當前瀏覽器不支援建立XMLHttpRequest物件,請更換瀏覽器");
                    return;
                }

  第二部

  註冊回撥函式

  設定的毀掉函式不要再函式名後面加括號,括號表示將回調函式的返回值註冊給noreadystatechange屬性。正確的方式應該是將回調函式的名字註冊給這個屬性。

  JS程式碼:

  //錯誤的寫法:xmlhttp.onreadystatechange=callback();  
  xmlhttp.onreadystatechange=callback;

  第三部

  使用open方法設定和伺服器端互動的基本資訊

  Open(“method”,“url”,boolean),第一個引數提供呼叫的特定方法(get、post),第二個引數提供所呼叫資源的URL,boolean 表示同步(false)或者非同步操作(true)。

  GET方法

  userName為獲取的使用者名稱的id

  xmlhttp.open("GET","AJAX?name=" + userName,true);

  POST方法

  Post方式,open方法後需要先呼叫setRequestHeader方法來設定Content-Type,然後呼叫send方法,send中的引數為請求的資料。

       //設定和伺服器互動的相應引數
              xmlhttp.open("POST","AJAX",true);              
               //POST方式互動所需要增加的程式碼
              xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

  第四部

  設定傳送的資料,開始和伺服器端互動

  由於open方法使用的方式不同,所以使用send方法傳送資料的引數也有所不同。

  GET方式:

  Xmlhttp.send(null);

  POST方式:

  Xmlhttp.send(“name”+userName);

  第五部

  在回撥函式中判斷互動是否結束,影響是否正確,並根據需要獲取伺服器端返回的資料,更新頁面內容。

     function callback(){

                //5.判斷和伺服器端的互動是否完成,還要判斷伺服器端是否正確返回

               if(xmlhttp.readyState==4){

                    //表示和伺服器端的互動已經完成

                   if(xmlhttp.status==200){

                        //表示伺服器的響應程式碼是200,正確返回了資料

                        //純文字資料的接受方法

                        varmessage=xmlhttp.responseText;

                        //XML資料對應的DOM物件接受方法

                        //使用的前提是,伺服器端需要設定contenttype為text/xml

                        //vardomXml=xmlhttp.responseXML;                       

                        //記憶向div標籤中填充文字內容的方法

                        var div=document.getElementById("message");

                       div.innerHTML=message;
                    }
                }
            }

  注意事項

  1. 由於瀏覽器的問題導致我們建立XMLHttpRequest物件的實現方式不同。Open的方法引數最多有5個(method ,url,Boolean,username,password)其中

   method表示HTTP的請求方法,包括GET和POST;

   URL表示請求的伺服器的地址;

   Boolean中true表示非同步操作、false表示同步;

   Username和password 分別表示使用者名稱和密碼,可以不寫。

  2.設定的回撥函式沒有括號()。

  3.使用回撥函式時,判斷readyState==4的時候表示和伺服器完成了互動。