原生AJAX發送請求詳解

使用XHR對象的基本步驟:
(1)創建XHR對象
var xhr = new XMLHttpRequest( );
(2)監聽XHR對象的狀態改變事件
xhr.onreadystatechange = function(){
if( xhr.readyState===4){
if(xhr.status===200){ 完成且成功 }
else { 完成但失敗 }
}
}
(3)打開到服務器的連接
xhr.open(method,  uri,  true)
(4)發起請求消息
xhr.send( null/data )

xhr.readyState:   0   1    2    3     4
xhr.status:  0  =>  200
xhr.responseText: ''   =>  '響應主體內容'

1.使用XHR發起異步的GET請求

var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
       if(xhr.readyState===4){
         if(xhr.status===200){ //響應完成且成功
           doResponse(xhr.responseText);
         }else{  //響應完成但不成功
           alert('響應完成但失敗!'+xhr.status);
         }
       }
     }
     xhr.open('GET','xx.php?k1=v1&k2=v2',true);
    xhr.send( null );

注意:GET請求沒有請求主體,所以send(null);若有請求數據,追加爲URI後面的查詢字符串。

舉例如下:

<h3>不間斷的成績錄入系統</h3>
  學生姓名:<input id="stuname">
  語文成績:<input id="chinese">
  數學成績:<input id="math">

  <input id="btSave" type="button" value="保存記錄">

  <div id="msg">
    <b>記錄成功成功!</b>
    新記錄在數據庫中的編號爲:<span></span>
  </div>
  <script>
  btSave.onclick = function(){
    //獲取用戶的輸入
    var n = stuname.value;
    var c = chinese.value;
    var m = math.value;

    //發起異步的GET請求,把用戶的輸入提交給服務器端的PHP頁面
    //1 
    var xhr = new XMLHttpRequest();
    //2
    xhr.onreadystatechange = function(){
      if(xhr.readyState===4){
        if(xhr.status===200){ //響應完成且成功
          doResponse(xhr.responseText);
        }else{  //響應完成但不成功
          alert('響應完成但失敗!'+xhr.status);
        }
      }
    }
    //3
    xhr.open('GET','1_score_add.php?stuname='+n+'&chinese='+c+'&math='+m,true);
    //4
    xhr.send( null );
  }
  function doResponse(txt){
    console.log('開始處理服務器返回的響應數據...');  
    txt = parseInt(txt);
    if(txt>0){
      var span = document.querySelector('#msg span');
      span.innerHTML = txt;
      msg.style.display = 'block';  //顯示成功消息
      stuname.value = ''; //清空文本框中的輸入
      chinese.value = '';
      math.value = '';
    }
  }

  </script>

2.使用XHR發起POST請求

var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
       if(xhr.readyState===4){
         if(xhr.status===200){ //響應完成且成功
           doResponse(xhr.responseText);
         }else{  //響應完成但不成功
           alert('響應完成但失敗!'+xhr.status);
         }
       }
     }
     xhr.open('POST', 'xxx.php', true); //URI無請求數據
//3.5 設置請求主體的內容類型
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send( 'k1=v1&k2=v2' ); //提交請求主體,必須編碼後提交

注意:POST請求不在URI後面追加查詢字符串——請求數據放在請求主體中send()——請求主體發送前必須設置Content-Type請求頭部;且請求主體中的中文、特殊標點必須使用encodeURIComponent()函數進行編碼。

舉例:

<h3>不間斷的成績錄入系統</h3>
  學生姓名:<input id="stuname"><br>
  語文成績:<input id="chinese"><br>
  數學成績:<input id="math"><br>
  <input id="btSave" type="button" value="保存記錄">

  <div id="msg">
    <b>記錄成功成功!</b><br>
    新記錄在數據庫中的編號爲:<span></span>
  </div>
  <script>
  btSave.onclick = function(){
    //獲取用戶的輸入
    var n = stuname.value;
    var c = chinese.value;
    var m = math.value;

    //發起異步的POST請求,把用戶的輸入提交給服務器端的PHP頁面
    //1 
    var xhr = new XMLHttpRequest();
    //2
    xhr.onreadystatechange = function(){
      if(xhr.readyState===4){
        if(xhr.status===200){ //響應完成且成功
          doResponse(xhr.responseText);
        }else{  //響應完成但不成功
          alert('響應完成但失敗!'+xhr.status);
        }
      }
    }
    //3
    xhr.open('POST','1_score_add.php',true);
    //3.5 設置請求消息主體的內容類型
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    //4
    n = encodeURIComponent(n);
    c = encodeURIComponent(c);
    m = encodeURIComponent(m);
    xhr.send( 'stuname='+n+'&chinese='+c+'&math='+m ); //POST請求消息有主體
  }
  function doResponse(txt){
    console.log('開始處理服務器返回的響應數據...');  
    txt = parseInt(txt);
    if(txt>0){
      var span = document.querySelector('#msg span');
      span.innerHTML = txt;
      msg.style.display = 'block';  //顯示成功消息
      stuname.value = ''; //清空文本框中的輸入
      chinese.value = '';
      math.value = '';
    }
  }
  </script>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章