原生js實現ajax的封裝
阿新 • • 發佈:2020-12-12
1. ajax的介紹
1.1 含義
ajax 的全稱是AsynchronousJavaScriptand XML
簡單理解下:ajax就是非同步的js和服務端的資料
1.2 組成
非同步的js:事件,物件等
其他js:資料處理和解析的js
伺服器的載體:xhr物件
服務端的資料:json,xhr,html,txt等字元型資料
1.3 作用
它作為前端向後端傳送資料請求的重要手段,可以實現網頁無重新整理載入資料.
1.4 利弊
與傳統的form表單的get和post方式相比較,ajax的優點很明顯
優點:1.提升載入速度,實現區域性載入
2.節省效能,能很好提升使用者體驗
當然,事物都是相對的,缺點如下
缺點:1.破壞了瀏覽器的前進後退功能
2.破壞了seo的網路優化
廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全https://redbox.wode007.com
2. ajax的書寫
2.1.1 ajax的GET請求方式
GET請求的資料會附在URL之後, 以 ? 分割URL和傳輸資料, 引數之間以 & 相連
//1.建立xhr物件
var xhr = new XMLHttpRequest();
//2.xhr的傳送方式:get
xhr.open("GET", url, true)
//引數1:請求方式
//引數2:url是後端檔案所在伺服器的位置
//引數3:非同步true;同步false
//3.監聽xhr物件的狀態
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
//客戶端狀態碼為4:響應內容解析完成,可以呼叫
//服務端的狀態碼為200:交易成功
console.log(xhr.responseTxt)
//返回響應資訊
}
//4.傳送資訊
xhr.send();
2.1.2 小bug
以上是最基本的ajax程式碼,有兩處小bug, 在封裝過程中會解決
bug1:傳的引數為空時,會報錯
bug2:瀏覽器的快取干擾使得資料無法重新整理
2.1.3 ajax的Get方式封裝
//接收三個引數:後端檔案地址,回撥函式和資料(物件格式)
function ajaxGet(url, callback, data) {
//1.解析傳送的資料
data = data || {};
//修復bug1:引數為空變為空物件
var str = "";
for (var i in data) {
str += `${i}=${data[i]}&`;
//拼接get的資料格式
}
//2.拼接url
var d = new Date();
url = url + "?" + str + "__sjc=" + d.getTime();
//修復bug2:拼接一個不會重複的時間戳,欺騙快取;
//時間戳的命名應該儘量複雜,防止後端讀取到.
//3. 準備ajax
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
callback(xhr.responseText);
}
}
xhr.send();
}
2.2.1 ajax的POST請求方式
ajax的POST和GET的結構大體相同,但有以下三點區別
區別1:post傳送資料位置是send()內,而不是拼接在url後
區別2:open的請求方式變為POST
區別3:send會原樣傳送資料,為確保後端能識別,必須設定資料格式為表單格式
2.2.1 ajax的POST方式封裝
function ajaxPost(url, callback, data) {
data = data || {};
var str = "";
for (var i in data) {
str += `${i}=${data[i]}&`;
}
//不必拼接時間戳
var xhr = new XMLHttpRequest();
//區別2
xhr.open("POST", url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
callback(xhr.responseText);
}
}
//區別3:傳送前設定資料格式
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//區別1:資料傳送在send內
xhr.send(str);
}