AJAX原理

AJAX是什么

AJAX = Async JavaScript And XML
可以說用JS發(fā)請求和收響應(yīng)就是AJAX的全部內(nèi)容
AJAX是瀏覽器上的功能

  • 瀏覽器可以發(fā)請求,收響應(yīng)
  • 瀏覽器在window上加了一個XMLHttpRequest函數(shù)
  • 用這個構(gòu)造函數(shù)(類)可以構(gòu)造出一個對象
    JS通過它來發(fā)請求和收響應(yīng)

利用AJAX來加載CSS寻拂、JS布近、HTML佳镜、XML、JSON

加載CSS

我們在加載CSS一般的方法為<link rel=stylesheet href="1.css"/>,我們也可以使用AJAX來進(jìn)行加載嫉柴。
步驟如下:

創(chuàng)建 HttpRequest 對象(全稱是 XMLHttpRequest)
調(diào)用對象的 open 方法
監(jiān)聽對象的 onload & onerror 事件
調(diào)用對象的 send 方法(發(fā)送請求)
代碼演示:

getCSS.onclick = () => {
const request = new XMLHttpRequest(); //創(chuàng)建HttpRequest對象
request.open("GET", "/style.css"); //調(diào)用對象的open方法
request.onload = () => {
console.log(request.response);
console.log("成功了");

const style = document.createElement("style"); //創(chuàng)建style標(biāo)簽
style.innerHTML = request.response; //填寫style內(nèi)容
document.head.appendChild(style); //插入到head標(biāo)簽里面
}; //監(jiān)聽對象的onload事件
request.onerror = () => {
console.log("失敗了");
}; //監(jiān)聽對象的error事件
request.send(); //調(diào)用對象的send方法
};

加載JS

我們以前使用常規(guī)方法就是引入<script src="2.js"></script>胖眷,JS也是可以用AJAX來進(jìn)行實現(xiàn)的武通。
步驟同CSS就不進(jìn)行演示了。

加載HTML

以往我們在一個html中是不會加載一個html的珊搀,如果加載也是iframe標(biāo)簽冶忱。我們可以通過AJAX來對一個HTML進(jìn)行一個輕量級的請求。
步驟大致與加載CSS相同境析,具體代碼如下

getHTML.onclick = () => {
  const request = new XMLHttpRequest(); //還是創(chuàng)建HTTPRequest對象
  request.open("GET", "/3.html"); //調(diào)用open
  request.onload = () => {
    const div = document.createElement("div"); //創(chuàng)建一個div
    div.innerHTML = request.response; //在這個div里面寫上內(nèi)容
    document.body.appendChild(div); //放入body里面囚枪,以上三行是對于成功請求的事件進(jìn)行能夠加載的處理(輕量級請求)
  };
  request.onerror = () => {}; //onerror不是很好的適配AJAX
  request.send();
};

onreadystatechange

可以看到以上兩段代碼都出現(xiàn)了onload和onerror,但是onerror也不會寫什么內(nèi)容劳淆。我們可以用一個更高級的API叫做onreadystatechange()其中涉及到一個屬性叫做readystate链沼,它是用來表示這個XMLHttpRequest對象的一生的

const request = new XMLHttpRequest(); //此時readyState=0
request.open(); //此時readyState=1
request.send(); //此時readyState=2
//響應(yīng)出第一個字節(jié)此時readyState=3
//完全下載完畢此時readyState=4

我們可以利用onreadystatechange()來對加載CSS進(jìn)行改寫

getCSS.onclick = () => {
const request = new XMLHttpRequest(); //創(chuàng)建HttpRequest對象,此時readystate是0
request.open("GET", "/style.css"); //調(diào)用對象的open方法,此時readystate是1
request.onreadystatechange = () => {
console.log(request.readyState);
if (request.readyState === 4) {
//下載完成憔儿,但不知道是否成功 成功一般為2xx 失敗可能為4xx 5xx
if (request.status >= 200 && request.status <= 300) {
const style = document.createElement("style"); //創(chuàng)建style標(biāo)簽
style.innerHTML = request.response; //填寫style內(nèi)容
document.head.appendChild(style); //插入到head標(biāo)簽里面
} else {
alert("加載css失敗");
}
}
};

加載XML

步驟如下:

創(chuàng)建 HttpRequest 對象(全稱是 XMLHttpRequest)
調(diào)用對象的 open 方法
監(jiān)聽對象的 onreadystatechange 事件 ——在事件處理函數(shù)里操作 responseXML
調(diào)用對象的 send 方法(發(fā)送請求)
代碼演示:

//給XML事件一個監(jiān)聽
getXML.onclick = () => {
const request = new XMLHttpRequest();
request.open("GET", "/4.xml");
request.onreadystatechange = () => {
if (request.readyState === 4 && request.status === 200) {
const dom = request.responseXML; //DOM對象不止是用于HTMl也用于XML
const text = dom.getElementsByTagName("warning")[0].textContent; //注意要加[0]忆植,否則將會獲得一個偽數(shù)組
console.log(text.trim()); //trim一下可以消除回車
}
};
request.send();
};

小結(jié)

解析方法得到 CSS 之后生成 style 標(biāo)簽
得到 JS 之后生成 script 標(biāo)簽
得到 HTML 之后使用 innerHTML 和 DOM API
得到 XML 之后使用 responseXML 和 DOM API
不同類型的數(shù)據(jù)有不同類型的解析辦法


加載JSON

什么是JSON

JavaScript Object Notation
JSON是一門語言,是一門標(biāo)記語言谒臼,與HTML朝刊、XML、Markdown一樣用來展示數(shù)據(jù)

截屏2022-07-30 12.27.28.png

JSON支持的數(shù)據(jù)類型:number,bool,string,null,object,array
字符串用雙引號蜈缤,沒有undefined拾氓,不支持函數(shù),不支持變量

加載JSON

創(chuàng)建 HttpRequest 對象(全稱是 XMLHttpRequest)
調(diào)用對象的 open 方法
監(jiān)聽對象的 onreadystatechange 事件 ——在事件處理函數(shù)里使用 JSON.parse
調(diào)用對象的 send 方法(發(fā)送請求)
代碼演示:

//給JSON事件一個監(jiān)聽
getJSON.onclick = () => {
const request = new XMLHttpRequest();
request.open("GET", "/5.json");
request.onreadystatechange = () => {
if (request.readyState === 4 && request.status === 200) {
console.log(typeof request.response);
console.log(request.response);
const bool = JSON.parse(request.response); //SON 字符串 => JS 數(shù)據(jù),由于 JSON 只有六種類型底哥,所以轉(zhuǎn)成的數(shù)據(jù)也只有6種
console.log(typeof bool);
console.log(bool);
}
};
request.send();
};

這里用到了JSON.parse咙鞍,要用try catch 捕獲錯誤

let object;
try {
object = JSON.parse(`{'name':'origami'}`);
} catch (error) {
console.log("出錯了,錯誤詳情是");
console.log(error);
object = { name: "noname" };
}
console.log(object);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趾徽,一起剝皮案震驚了整個濱河市续滋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孵奶,老刑警劉巖疲酌,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡朗恳,警方通過查閱死者的電腦和手機(jī)湿颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粥诫,“玉大人油航,你說我怎么就攤上這事』辰” “怎么了谊囚?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揉稚。 經(jīng)常有香客問我秒啦,道長,這世上最難降的妖魔是什么搀玖? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任余境,我火速辦了婚禮,結(jié)果婚禮上灌诅,老公的妹妹穿的比我還像新娘芳来。我一直安慰自己,他們只是感情好猜拾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布即舌。 她就那樣靜靜地躺著,像睡著了一般挎袜。 火紅的嫁衣襯著肌膚如雪顽聂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天盯仪,我揣著相機(jī)與錄音紊搪,去河邊找鬼。 笑死全景,一個胖子當(dāng)著我的面吹牛耀石,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爸黄,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼滞伟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炕贵?” 一聲冷哼從身側(cè)響起梆奈,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎称开,沒想到半個月后鉴裹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年径荔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脆霎。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡总处,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睛蛛,到底是詐尸還是另有隱情鹦马,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布忆肾,位于F島的核電站荸频,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏客冈。R本人自食惡果不足惜旭从,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望场仲。 院中可真熱鬧和悦,春花似錦、人聲如沸渠缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亦鳞。三九已至馍忽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燕差,已是汗流浹背遭笋。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谁不,地道東北人坐梯。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像刹帕,于是被迫代替她去往敵國和親吵血。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • AJAX 的原理(Async JavaScript And XML) js三座大山之AjaxAjax的全部內(nèi)容: ...
    珍惜時間小李閱讀 177評論 0 0
  • Ajax的本質(zhì)就是---用JS發(fā)請求和收請求瀏覽器具有發(fā)送和接受請求的功能偷溺,所以可不可以將這個功能暴露給開發(fā)者呢蹋辅?...
    Marshall3572閱讀 296評論 0 0
  • ajax作為前端開發(fā)必需的基礎(chǔ)能力之一,你可能會使用它挫掏,但并不一定懂得其原理侦另,以及更深入的服務(wù)器通信相關(guān)的知識。在...
    蕭玄辭閱讀 830評論 0 0
  • Ajax工作原理及實例 1、關(guān)于ajax的名字 ajax 的全稱是Asynchronous JavaScript ...
    雷爺_fefc閱讀 298評論 0 1
  • Ajax的原理簡單來說通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求褒傅,從服務(wù)器獲得數(shù)據(jù)弃锐,然后用javas...
    古城凌三少閱讀 725評論 0 0