今天看一個面試題 原生Ajax工作原理以及實現過程
ajax:
ajax 的全稱是Asynchronous JavaScript and XML(非同步的JavaScript 和 XML)
Ajax 相當於在使用者和伺服器之間加了一箇中間層 使使用者操作和伺服器響應非同步化 之前傳統的是 一個請求 要使用者把所有資料都提交個伺服器 其實一些資料驗證和資料處理等是可以交給Ajax引擎自來來做 只要確定需要從伺服器讀取新資料再由Ajax引擎代為向伺服器提交請求ajax 區域性重新整理
ajax利用XMLHttpRequest 物件與伺服器通訊 從伺服器獲得資料 然後由js操作dom來更新頁面XMLHttpRequest屬性
- onreadystatechange 每次狀態改變時候觸發事件
- readyState 表示物件狀態
- responseText 伺服器響應文字內容
- Status 伺服器返回的http狀態碼
- statusText 伺服器返回狀態文字資訊
- 請求伺服器過程的5種狀態
- 0 表示請求伺服器之前
- 1 表示開啟 open() 方法
- 2 表示向伺服器傳送 send方法
- 3 表示伺服器響應過程還沒有結束
- 4 表示伺服器響應完成
- ajax 優點
- 頁面區域性重新整理 在頁面內與伺服器通訊
- 使用非同步方式與伺服器通訊 不需要打斷使用者操作
- 伺服器的一些負擔轉到客戶端
- 客戶端不用從後臺拉取所有資料 按需取資料
- ajax 缺點
ajax幹掉了back按鈕 對瀏覽器後退機制破壞
ajax 請求過程
- 建立XMLHtppRequest 物件
Ie7以及以上都支援原生XHR物件 直接可以 new XMLHttpRequest()
Ie6之前的 XHR是通過ActiveX物件來實現的 new ActiveXObject('Microsoft.XMLHTTP') - 連線服務
open() 函式三個引數 請求方式 請求地址 是否非同步
- 傳送資料
open() 傳送資料 get post 將資料提交到伺服器
- 接收
接收到響應後 響應資料會自動填充XHR物件
responseText 響應放回主體內容 為字串型別
responseXML 響應型別 text/xml application/xml
status 響應HTTP狀態嗎
statusText HTTP狀態碼說明
- 建立XMLHtppRequest 物件
code 封裝
newajax({
url: 'XXX',
type: 'GET'
dataType: 'json'
success: function (response, xml){
},
fail: function (response, xml){
}
})
function newajax(options) {
if (options.data) {
var body = options.data
} else {
var body = ''
}
// 按照上述步驟來
//1. 建立XMLHttpRequest
if(window.XMLHttpRequest) {
var xhr = new XMLHttpRequest()
} else {
var xhr = new ActiveXOject('Microsoft.XMLTHHP')
}
// 2.連結傳送
if(options.type == 'GET') {
xhr.open('GET', options.url, true)
xhr.send(null) //content 不傳送資料
} else if (options.type == 'POST') {
xhr.open('POST', options.url, true)
xhr.setRequestHeader("Content-Type", "XXX"); //設定內容型別
xhr.send(body)
}
//接收 onreadystatechange 處理事件
xhr.onreadystatechange = function () {
console.log(xhr.readyState)
if(xhr.readyState == 4) {
var status = xhr.status
if(status >=200 && status<300) {
options.success(xhr.responseText, xhr.responseXML)
} else {
options.fail(xhr.responseText, xhr.responseXML)
}
}
}
}複製程式碼
就這些了 最核心的就是XHR物件 裡面一個屬性 可以去了解下
參考閱讀:
Ajax的工作原理