手動封裝AJAX


正常函數的調用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>函數的調用</title>
</head>
<body>
  <script>
    function f1(){
      console.log('1111111111111');
      console.log('1111111111111');
      console.log('1111111111111');
      console.log('1111111111111');
      console.log('1111111111111');
    }
    function f2(){
      console.log('222222222222222');
      console.log('222222222222222');
      f1();
      console.log('222222222222222');
      console.log('222222222222222');
      console.log('222222222222222');
    }
    function f3(){
      console.log('3333333333333333');
      console.log('3333333333333333');
      f2();
      console.log('3333333333333333');
      console.log('3333333333333333');
      console.log('3333333333333333');
    }
    f3()
  </script>
</body>
</html>

調用順序:

調用f3函數,輸出2次33333,然后調用f2函數,輸出2次22222,調用f1函數,輸出5次1111111;
f1的代碼執行完成后會回到被調用的位置接着執行代碼,此時輸出3次222222,然后回到f2被調用的位置,輸出3次333
 

回調函數

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>回調函數</title>
</head>
<body>
  <script>
    
    function getResult(n1,n2,fn){
      var result = fn(n1,n2)
      return result;
    }
    var res = getResult(120,230, function (a, b) {
        return a + b;
      })
    console.log(res);
  </script>
</body>
</html>

調用順序:

調用getResult時傳入3個參數,第3個是一個匿名函數,函數里面計算ab的和,getResult接受到120,230參數分別賦值給n1和n2,然后調用fn函數進行計算值,返回結果給result,返回result給res接收,最后控制台輸出res就得到350了。

 

Get和Post請求的差異

 

封轉AJAX異步發送請求的過程

目錄結構:

 

myAjax.js

/*
1.創建異步對象
2. 設置請求行
3. 設置請求頭
4.  設置請求體
5.  設置監視異步對象狀態
*/

// 這種方式不好,參數固定死了,不靈活,順序只能這樣
// ajax是一個函數,如果引入到別的文件當中,有可能會靠變量或函數的污染

/* function ajax(params) {
  var xhr = new XMLHttpRequest();
  // 設置請求行
  xhr.open('get', '/getStudentsJSON');
  // 設置請求頭
  // get請求可以省略這一步
  // 設置請求體
  xhr.send(null);
  // 監聽異步對象狀態
  xhr.onreadystatechange = function () {
      // 判斷數據是否全部接收完成
      if (xhr.status == 200 && xhr.readyState == 4) {
        // 由於服務端響應過來的json數據是字符串類型的,這里需要把它轉換成對象或者數組類型,使用JSON.parse()方法
        var obj = JSON.parse(xhr.responseText);
        console.log(obj);
      }
  }
} */

var $ = {
  // 創建一個名為convert方法,把對象轉換成拼接字符串的方法
  convertTostring: function(obj){
    var str = '';
    for(var key in obj){
      str += key + '=' + obj[key] + '&';
      console.log(str);
    }
    console.log(str.slice(0,-1));
    return str.slice(0,-1);
  },

  // 代碼沒問題
  // 創建一個名為ajax方法,進行使用異步對象發送請求
  ajax: function(params) { // 傳入的參數是一個對象
    // 這個parmas對象里面應該包括:type,url,data,callback
    // 定義變量獲取數據, 短路運算
    var type = params.type || 'get';  // 獲取請求的方式
    var url = params.url || location.pathname;  //location.href也可以;  獲取要發送的目標地址
    var data = this.convertTostring(params.data || {}); // 獲取要發送的數據
    var success = params.success;
    var dataType = params.dataType || 'text/plain';   // 什么都沒有就以純字符串

    // 創建異步AJAX對象
    var xhr = new XMLHttpRequest();

    if(type=='get'){
      url = url+"?"+data; //http://baidu.com:3002/submit?userName=jack&passPWd=jack1234
      data = null;
    }
    // 設置請求行
    xhr.open(type, url);
    // 設置請求頭
    if(type=='post'){
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    // get請求可以省略這一步
    // 設置請求體
    xhr.send(data);   // 這里的data就是通過convertTostring方法拼接的字符串
    // 監聽異步對象狀態
    xhr.onreadystatechange = function () {
      // 判斷數據是否全部接收完成
      if (xhr.status == 200 && xhr.readyState == 4) {
        var res;
        // 把服務器響應回來的數據進行判斷然后保存起來
        if(dataType =='json'){
          res = JSON.parse(xhr.responseText)
        }else if(dataType=='xml'){
          res = xhr.responseXML;
        }else{
          res = xhr.responseText;   // 當成純文本字符串接收
        }
          success(res);
      }
    }
  }
}

 

studentsJSON.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>studentsJSON頁面</title>
  <!-- <script src="/assets/js/myAjax.js"></script> -->
  <!-- 引入jQuery文件 -->
  <script src="/assets/js/jquery-1.12.2.js"></script>

</head>

<body>
  <h2>這是studentsJSON頁面</h2>
  <input type="button" id="btn" value="獲取JSON數據">
  <table border="1">
    <thead>
      <th>id</th>
      <th>姓名</th>
      <th>性別</th>
      <th>年齡</th>
      <th>專業</th>
      <th>地址</th>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>小蘇</td>
        <td>男</td>
        <td>18</td>
        <td>前端</td>
        <td>佛山</td>
      </tr>
    </tbody>
  </table>

  <script>
    // 查找元素
    var btn = document.querySelector('#btn');
    var tbody = document.querySelector('tbody');

    // 給btn綁定點擊事件
    btn.addEventListener('click', function () {
      $.ajax({
        type: 'get',
        url: '/getStudentsJSON',
        dataType: 'json',  // 告訴ajax函數,將返回來的數據以json的形式進行處理

        // 創建一個方法
        success: function (obj) {
          var data = obj.data;
          var str = '';
          for (var i = 0; i < data.length; i++) {
            // 套用ES6的模版快速拼接字符串
            str += `
              <tr>
                <td>${data[i].id}</td>
                <td>${data[i].name}</td>
                <td>${data[i].gender}</td>
                <td>${data[i].age}</td>
                <td>${data[i].zhuanye}</td>
                <td>${data[i].address}</td>
             </tr>
              `
          }
          // 渲染頁面中的數據
          tbody.innerHTML = str;
        },
      })
    })

  </script>
</body>

</html>

 

studentsXML.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>studentsXML頁面</title>
  <!-- 引入封轉好的AJAX文件 -->
  <script src="/assets/js/myAjax.js"></script>
</head>

<body>
  <h2>這是一個使用XML數據渲染的列表</h2>
  <input type="button" id="btn" value="獲取XML數據">
  <table border="1">
    <thead>
      <th>id</th>
      <th>姓名</th>
      <th>性別</th>
      <th>年齡</th>
      <th>專業</th>
      <th>地址</th>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>小蘇</td>
        <td>男</td>
        <td>18</td>
        <td>前端</td>
        <td>佛山</td>
      </tr>
    </tbody>
  </table>

  <script>
    // 查找元素
    var btn = document.querySelector('#btn');
    var tbody = document.querySelector('tbody');

    // 給按鈕綁定點擊事件
    btn.addEventListener('click', function () {
      // 調用ajax方法傳入參數
      $.ajax({
        type: 'get',    // 請求方式
        url: '/getStudentsXML',   // 服務器接口地址
        dataType: 'xml',   // 服務器返回的數據格式
        success: function(obj){    // 回調函數
          console.log(obj);
          console.log(typeof(obj));
          var items = obj.querySelector('items').children;
          var str = '';
          for(var i=0; i<items.length; i++){
            str += `
              <tr>
                <td>${items[i].querySelector('id').innerHTML}</td>
                <td>${items[i].querySelector('name').innerHTML}</td>
                <td>${items[i].querySelector('gender').innerHTML}</td>
                <td>${items[i].querySelector('age').innerHTML}</td>
                <td>${items[i].querySelector('zhuanye').innerHTML}</td>
                <td>${items[i].querySelector('address').innerHTML}</td>
              </tr>
            `
          }
          tbody.innerHTML = str;
        }
      });
      
  })

  </script>
</body>

</html>

 

如果不想手動封裝AJAX,可以使用JQuery,直接引入jQ文件,其他不需要改,直接$.ajax({傳參})就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM