Ajax的原理:
簡(jiǎn)單來說就是 通過XmlHttpRequest對(duì)象向服務(wù)器發(fā)異步請(qǐng)求乍丈,從服務(wù)器獲得數(shù)據(jù),然后用 javascript 來操作DOM更新頁(yè)面的技術(shù)虹茶。
一般來說疑故,大家可能都會(huì)習(xí)慣用JQuery提供的Ajax方法,但是用原生的js怎么去實(shí)現(xiàn)Ajax方法呢俏讹?
JQuery提供的Ajax方法:
$.ajax({
url: ,
type: '',
dataType: '',
data: {
},
success: function(){
},
error: function(){
}
})
原生js實(shí)現(xiàn)Ajax方法是這樣的:
var Ajax = {
get: function(url,callback){
// XMLHttpRequest對(duì)象用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)
var xhr=new XMLHttpRequest();
xhr.open('GET',url,false);
xhr.onreadystatechange=function(){
// readyState == 4說明請(qǐng)求已完成
if(xhr.readyState==4){
if(xhr.status==200 || xhr.status==304){
console.log(xhr.responseText);
callback(xhr.responseText);
}
}
}
xhr.send();
},
// data應(yīng)為'a=a1&b=b1'這種字符串格式当宴,在jq里如果data為對(duì)象會(huì)自動(dòng)將對(duì)象轉(zhuǎn)成這種字符串格式
post: function(url,data,callback){
var xhr=new XMLHttpRequest();
xhr.open('POST',url,false);
// 添加http頭,發(fā)送信息至服務(wù)器時(shí)內(nèi)容編碼類型
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.onreadystatechange=function(){
if (xhr.readyState==4){
if (xhr.status==200 || xhr.status==304){
// console.log(xhr.responseText);
callback(xhr.responseText);
}
}
}
xhr.send(data);
}
}
代碼注釋:
- open(method, url, async) 方法需要三個(gè)參數(shù):
method:發(fā)送請(qǐng)求所使用的方法(GET或POST)泽疆;與POST相比户矢,GET更簡(jiǎn)單也更快,并且在大部分情況下都能用殉疼;然而梯浪,在以下情況中,請(qǐng)使用POST請(qǐng)求:
①無法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
②向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
③發(fā)送包含未知字符的用戶輸入時(shí)瓢娜,POST 比 GET 更穩(wěn)定也更可靠
url:規(guī)定服務(wù)器端腳本的 URL(該文件可以是任何類型的文件挂洛,比如 .txt 和 .xml,或者服務(wù)器腳本文件眠砾,比如 .asp 和 .php (在傳回響應(yīng)之前虏劲,能夠在服務(wù)器上執(zhí)行任務(wù)));
async:規(guī)定應(yīng)當(dāng)對(duì)請(qǐng)求進(jìn)行異步(true)或同步(false)處理褒颈;true是在等待服務(wù)器響應(yīng)時(shí)執(zhí)行其他腳本柒巫,當(dāng)響應(yīng)就緒后對(duì)響應(yīng)進(jìn)行處理;false是等待服務(wù)器響應(yīng)再執(zhí)行谷丸。
send() 方法可將請(qǐng)求送往服務(wù)器堡掏。
onreadystatechange:存有處理服務(wù)器響應(yīng)的函數(shù),每當(dāng) readyState 改變時(shí)刨疼,onreadystatechange 函數(shù)就會(huì)被執(zhí)行布疼。
readyState:存有服務(wù)器響應(yīng)的狀態(tài)信息摊趾。
0: 請(qǐng)求未初始化(代理被創(chuàng)建,但尚未調(diào)用 open() 方法)
1: 服務(wù)器連接已建立(open方法已經(jīng)被調(diào)用)
2: 請(qǐng)求已接收(send方法已經(jīng)被調(diào)用游两,并且頭部和狀態(tài)已經(jīng)可獲得)
3: 請(qǐng)求處理中(下載中砾层,responseText 屬性已經(jīng)包含部分?jǐn)?shù)據(jù))
4: 請(qǐng)求已完成,且響應(yīng)已就緒(下載操作已完成)
responseText:獲得字符串形式的響應(yīng)數(shù)據(jù)贱案。
setRequestHeader():POST傳數(shù)據(jù)時(shí)肛炮,用來添加 HTTP 頭,然后send(data)宝踪,注意data格式侨糟;GET發(fā)送信息時(shí)直接加參數(shù)到url上就可以,比如url?a=a1&b=b1瘩燥。
Ajax的原理:
Ajax 的原理簡(jiǎn)單來說通過 XmlHttpRequest 對(duì)象來向服務(wù)器發(fā)異步請(qǐng)求秕重,從服務(wù)器獲得數(shù)據(jù),然后用javascript來操作DOM而更新頁(yè)面厉膀。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)溶耘。
要清楚這個(gè)過程和原理,我們必須對(duì) XMLHttpRequest 有所了解服鹅。XMLHttpRequest 是 ajax 的核心機(jī)制凳兵,它是在 IE5 中首先引入的,是一種支持異步請(qǐng)求的技術(shù)企软。簡(jiǎn)單的說庐扫,也就是 javascript 可以及時(shí)向服務(wù)器提出請(qǐng)求和處理響應(yīng),而不阻塞用戶仗哨,達(dá)到無刷新的效果形庭。
拓展ES6的 Promise 的AJAX GET方法請(qǐng)求數(shù)據(jù):
const getJSON = function(url) {
const promise = new Promise(function(resolve, reject){
const handler = function() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
};
const client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
});
return promise;
};
getJSON("promise.json").then(function(json) {
console.log('Data: ', json);
}, function(error) {
console.error('err', error);
});