javascript - 封裝原生js實現ajax

  1             /*
  2              * ajax方法
  3              */
  4             var Ajax = function() {
  5                 var that = this;
  6                 //創建異步請求對象方法
  7                 that.createXHR = function() {
  8                     if(window.XMLHttpRequest) { //IE7+、Firefox、Opera、Chrome 和Safari
  9                         return new XMLHttpRequest();
 10                     } else if(window.ActiveXObject) { //IE6 及以下
 11                         var versions = ['MSXML2.XMLHttp', 'Microsoft.XMLHTTP'];
 12                         for(var i = 0, len = versions.length; i < len; i++) {
 13                             try {
 14                                 return new ActiveXObject(version[i]);
 15                                 break;
 16                             } catch(e) {
 17                                 //跳過
 18                             }
 19                         }
 20                     } else {
 21                         throw new Error('瀏覽器不支持XHR對象!');
 22                     }
 23                 }
 24                 //初始化數據方法
 25                 that.init = function(obj) {
 26                     //初始化數據
 27                     var objAdapter = {
 28                             method: 'get',
 29                             data: {},
 30                             success: function() {},
 31                             complete: function() {},
 32                             error: function(s) {
 33                                 alert('status:' + s + 'error!');
 34                             },
 35                             async: true
 36                         }
 37                         //通過使用JS隨機字符串解決IE瀏覽器第二次默認獲取緩存的問題
 38                     that.url = obj.url + '?rand=' + Math.random();
 39                     that.method = obj.method || objAdapter.method;
 40                     that.data = that.params(obj.data) || that.params(objAdapter.data);
 41                     that.async = obj.async || objAdapter.async;
 42                     that.complete = obj.complete || objAdapter.complete;
 43                     that.success = obj.success || objAdapter.success;
 44                     that.error = obj.error || objAdapter.error;
 45                 }
 46                 //ajax異步調用
 47                 that.ajax = function(obj) {
 48                     that.method = obj.method || 'get';
 49                     if(obj.method === 'post'){
 50                         that.post(obj);
 51                     }else{
 52                         that.get(obj);
 53                     }
 54                 }
 55                 //post方法
 56                 that.post = function(obj) {
 57                     var xhr = that.createXHR(); //創建XHR對象
 58                     that.init(obj);
 59                     that.method='post';
 60                     if(that.async === true) { //true表示異步,false表示同步
 61                         //使用異步調用的時候,需要觸發readystatechange 事件
 62                         xhr.onreadystatechange = function() {
 63                             if(xhr.readyState == 4) { //判斷對象的狀態是否交互完成
 64                                 that.callback(obj,this); //回調
 65                             }
 66                         };
 67                     }
 68                     //在使用XHR對象時,必須先調用open()方法,
 69                     //它接受三個參數:請求類型(get、post)、請求的URL和表示是否異步。
 70                     xhr.open(that.method, that.url, that.async);
 71                     //post方式需要自己設置http的請求頭,來模仿表單提交。
 72                     //放在open方法之后,send方法之前。
 73                     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 74                     xhr.send(that.data); //post方式將數據放在send()方法里
 75                     if(that.async === false) { //同步
 76                         that.callback(obj,this); //回調
 77                     }
 78                 };
 79                 //get方法
 80                 that.get = function(obj) {
 81                     var xhr = that.createXHR(); //創建XHR對象
 82                     that.init(obj);
 83                     if(that.async === true) { //true表示異步,false表示同步
 84                         //使用異步調用的時候,需要觸發readystatechange 事件
 85                         xhr.onreadystatechange = function() {
 86                             if(xhr.readyState == 4) { //判斷對象的狀態是否交互完成
 87                                 that.callback(obj,this); //回調
 88                             }
 89                         };
 90                     }
 91                     //若是GET請求,則將數據加到url后面
 92                     that.url += that.url.indexOf('?') == -1 ? '?' + that.data : '&' + that.data;
 93                     //在使用XHR對象時,必須先調用open()方法,
 94                     //它接受三個參數:請求類型(get、post)、請求的URL和表示是否異步。
 95                     xhr.open(that.method, that.url, that.async);
 96                     xhr.send(null); //get方式則填null
 97                     if(that.async === false) { //同步
 98                         that.callback(obj,this); //回調
 99                     }
100                 }
101                 //請求成功后,回調方法
102                 that.callback = function(obj,xhr) {
103                         if(xhr.status == 200) { //判斷http的交互是否成功,200表示成功
104                             obj.success(xhr.responseText); //回調傳遞參數
105                         } else {
106                             alert('獲取數據錯誤!錯誤代號:' + xhr.status + ',錯誤信息:' + xhr.statusText);
107                         }
108                     }
109                 //數據轉換
110                 that.params = function(data) {
111                     var arr = [];
112                     for(var i in data) {
113                         //特殊字符傳參產生的問題可以使用encodeURIComponent()進行編碼處理
114                         arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
115                     }
116                     return arr.join('&');
117                 }
118                 return {
119                     post : that.post,
120                     get : that.get,
121                     ajax : that.ajax
122                 }
123             }

上述的Ajax方法可以看成是一個類,共有方法有:

? ?1. 初始化數據方法init(),

? ?2. 創建異步請求對象方法createXHR(),

? ?3.請求方法ajax(),post(),get(),

? ?4.請求成功后回調方法callback(),

? ?5.數據格式轉換方法params()

也可以看成一個函數,return 返回的json對象中定義的接口用于函數內方法的調用?

故而有有兩種方式進行使用封裝的Ajax

函數方式:測試代碼數據

 1             Ajax().post({
 2                 url: 'ajax.php',
 3                 data: {
 4                     'name': 'JR',
 5                     'age': 22
 6                 },
 7                 success: function(message) {
 8                     console.log(message);
 9                 },
10                 async: true
11             });

類方式:測試代碼數據

 1             var ajax = new Ajax();
 2             ajax.post({
 3                 url: 'ajax.php',
 4                 data: {
 5                     'name': 'JR',
 6                     'age': 22
 7                 },
 8                 success: function(message) {
 9                     console.log(message);
10                 },
11                 async: true
12             });

對上述封裝的ajax方法進行優化

  1var Ajax = {
  2                 //ajax模塊
  3                 init: function(obj) {
  4                     //初始化數據
  5                     var objAdapter = {
  6                             url: '',
  7                             method: 'get',
  8                             data: {},
  9                             success: function() {},
 10                             complete: function() {},
 11                             error: function(s) {
 12                                 alert('status:' + s + 'error!');
 13                             },
 14                             async: true
 15                         }
 16                         //通過使用JS隨機字符串解決IE瀏覽器第二次默認獲取緩存的問題
 17                     objAdapter.url = obj.url + '?rand=' + Math.random();
 18                     objAdapter.method = obj.method || objAdapter.method;
 19                     objAdapter.data = Ajax.params(obj.data) || Ajax.params(objAdapter.data);
 20                     objAdapter.async = obj.async || objAdapter.async;
 21                     objAdapter.complete = obj.complete || objAdapter.complete;
 22                     objAdapter.success = obj.success || objAdapter.success;
 23                     objAdapter.error = obj.error || objAdapter.error;
 24                     return objAdapter;
 25                 },
 26                 //創建XMLHttpRequest對象
 27                 createXHR: function() {
 28                     if(window.XMLHttpRequest) { //IE7+、Firefox、Opera、Chrome 和Safari
 29                         return new XMLHttpRequest();
 30                     } else if(window.ActiveXObject) { //IE6 及以下
 31                         var versions = ['MSXML2.XMLHttp', 'Microsoft.XMLHTTP'];
 32                         for(var i = 0, len = versions.length; i < len; i++) {
 33                             try {
 34                                 return new ActiveXObject(version[i]);
 35                                 break;
 36                             } catch(e) {
 37                                 //跳過
 38                             }
 39                         }
 40                     } else {
 41                         throw new Error('瀏覽器不支持XHR對象!');
 42                     }
 43                 },
 44                 params: function(data) {
 45                     var arr = [];
 46                     for(var i in data) {
 47                         //特殊字符傳參產生的問題可以使用encodeURIComponent()進行編碼處理
 48                         arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
 49                     }
 50                     return arr.join('&');
 51                 },
 52                 callback: function(obj, xhr) {
 53                     if(xhr.status == 200) { //判斷http的交互是否成功,200表示成功
 54                         obj.success(xhr.responseText); //回調傳遞參數
 55                     } else {
 56                         alert('獲取數據錯誤!錯誤代號:' + xhr.status + ',錯誤信息:' + xhr.statusText);
 57                     }
 58                 },
 59                 ajax: function(obj) {
 60                     if(obj.method === 'post') {
 61                         Ajax.post(obj);
 62                     } else {
 63                         Ajax.get(obj);
 64                     }
 65                 },
 66                 //post方法
 67                 post: function(obj) {
 68                     var xhr = Ajax.createXHR(); //創建XHR對象
 69                     var opt = Ajax.init(obj);
 70                     opt.method = 'post';
 71                     if(opt.async === true) { //true表示異步,false表示同步
 72                         //使用異步調用的時候,需要觸發readystatechange 事件
 73                         xhr.onreadystatechange = function() {
 74                             if(xhr.readyState == 4) { //判斷對象的狀態是否交互完成
 75                                 Ajax.callback(opt, xhr); //回調
 76                             }
 77                         };
 78                     }
 79                     //在使用XHR對象時,必須先調用open()方法,
 80                     //它接受三個參數:請求類型(get、post)、請求的URL和表示是否異步。
 81                     xhr.open(opt.method, opt.url, opt.async);
 82                     //post方式需要自己設置http的請求頭,來模仿表單提交。
 83                     //放在open方法之后,send方法之前。
 84                     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 85                     xhr.send(opt.data); //post方式將數據放在send()方法里
 86                     if(opt.async === false) { //同步
 87                         Ajax.callback(obj, xhr); //回調
 88                     }
 89                 },
 90                 //get方法
 91                 get: function(obj) {
 92                     var xhr = Ajax.createXHR(); //創建XHR對象
 93                     var opt = Ajax.init(obj);
 94                     if(opt.async === true) { //true表示異步,false表示同步
 95                         //使用異步調用的時候,需要觸發readystatechange 事件
 96                         xhr.onreadystatechange = function() {
 97                             if(xhr.readyState == 4) { //判斷對象的狀態是否交互完成
 98                                 Ajax.callback(obj, xhr); //回調
 99                             }
100                         };
101                     }
102                     //若是GET請求,則將數據加到url后面
103                     opt.url += opt.url.indexOf('?') == -1 ? '?' + opt.data : '&' + opt.data;
104                     //在使用XHR對象時,必須先調用open()方法,
105                     //它接受三個參數:請求類型(get、post)、請求的URL和表示是否異步。
106                     xhr.open(opt.method, opt.url, opt.async);
107                     xhr.send(null); //get方式則填null
108                     if(opt.async === false) { //同步
109                         Ajax.callback(obj, xhr); //回調
110                     }
111                 }
112             };

測試代碼

 1             Ajax.post({
 2                 url: 'ajax.php',
 3                 data: {
 4                     'name': 'JR',
 5                     'age': 22
 6                 },
 7                 success: function(message) {
 8                     console.log(message);
 9                 },
10                 async: true
11             });

ajax.php頁面代碼

1 <?php
2 echo $_POST['name'];
3 ?>

控制臺顯示

轉載于:https://www.cnblogs.com/jtnote/p/6022346.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT對象樹、信號和槽機制

文章目錄一 、對象樹是什么&#xff1f;二、信號和槽的基本概念2.1 信號2.2 槽2.3 松散耦合2.4 特點三、示例總結一 、對象樹是什么&#xff1f; 對象樹是由父類和若干子類對象組成&#xff0c;而子類也可以由若干孫類。 QT中的對象樹是以QObject為起始父類來完成樹的構建的&a…

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路&#xff1a;將兩個有序的子列表歸并為一個有序的大列表 #歸并函數&#xff0c;假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中&#xff0c;每當進入一個新的業務項目&#xff0c;從零開始搭建一套前端項目結構是一件讓人頭疼的事情&#xff0c;就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝&#xff0c;可以統一將…

如何使用ATS提高應用的安全性

App Transport Security&#xff0c;簡短的說就是ATS&#xff0c;是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 此文未本人工作中的總結&#xff0c;特此總結。 異常場景&#xff1a; 網絡異常&#xff0c;服務器異常&#xff0c;接口異常或參考參數篡改&#xff0c;斷電&#xff0c;…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么&#xff1f; NMS&#xff08;non maximum suppression&#xff09;即非極大值抑制&#xff0c;廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序&#xff0c;復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷&#xff0c;如果前面的元素已經是排序好的&#xff0c;那就不需要再進行比較了&#xff0c;減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中&#xff0c;我們將了解不同的事件&#xff0c;ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器&#xff08;對于 ASP.NET 應用程序&#xff0c;通常為 IIS&#xff09;發送請求為起點&#xff0c;直至將請求結果返回至瀏覽器結束。在這個過程中&#xff0c;首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP&#xff08;Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣&#xff0c;是一種擬合數據的算法。區別在于mls是局部的&#xff0c;即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合&#xff0c;需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的&#xff0c;采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述 Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域&#xff0c;第i行第j列的格子記為(i,j)&#xff0c;也就是左上角為(1,1)&#xff0c;右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中&#xff0c;冰地外圍&#xff08;即第0行、第n1行、第0列、…

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…

MATLAB調用Python自定義函數(類、函數等) Python調用MATLAB

一、MATLAB調用Python函數 參考鏈接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎鏈接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上這位說的更加的詳細&#xff0c;感謝 二、Python調用MATLAB-API 知乎鏈接&#xff1a;htt…