Ajax全接觸(一)基礎(chǔ)理論

什么是同步? 客戶(hù)端要發(fā)起請(qǐng)求,服務(wù)器端要去處理薪前,而且去響應(yīng)润努,這時(shí)候客戶(hù)端完全是等待,等待服務(wù)器端的處理和響應(yīng)示括,當(dāng)服務(wù)器端處理響應(yīng)后客戶(hù)端會(huì)重新載入頁(yè)面铺浇。這時(shí)候如果你有錯(cuò)誤,那么只能再次發(fā)起請(qǐng)求垛膝,再次等待鳍侣。同步的事件會(huì)讓人瘋狂。

同步和異步

什么是同步

Paste_Image.png

客戶(hù)端要發(fā)起請(qǐng)求吼拥,服務(wù)器端要去處理倚聚,而且去響應(yīng),這時(shí)候客戶(hù)端完全是等待凿可,等待服務(wù)器端的處理和響應(yīng)惑折,當(dāng)服務(wù)器端處理響應(yīng)后客戶(hù)端會(huì)重新載入頁(yè)面。這時(shí)候如果你有錯(cuò)誤枯跑,那么只能再次發(fā)起請(qǐng)求惨驶,再次等待。同步的事件會(huì)讓人瘋狂敛助。

什么是異步

Paste_Image.png

當(dāng)你填寫(xiě)表單數(shù)據(jù)時(shí)粗卜,頁(yè)面當(dāng)時(shí)就把數(shù)據(jù)發(fā)送到服務(wù)器,也就是頁(yè)面發(fā)送了個(gè)請(qǐng)求辜腺,服務(wù)器去做處理和響應(yīng)休建,得到你的數(shù)據(jù)不符合要求乍恐,他會(huì)把響應(yīng)結(jié)果,發(fā)給頁(yè)面测砂,但是在這個(gè)過(guò)程中茵烈,你還是可以依舊去填寫(xiě),表單其他內(nèi)容砌些,這時(shí)候服務(wù)器告訴你有填寫(xiě)錯(cuò)誤的地方呜投,在頁(yè)面上的表現(xiàn),只是把你填寫(xiě)錯(cuò)誤的旁邊標(biāo)上一行字存璃,并沒(méi)有刷新你的頁(yè)面仑荐,這樣在填寫(xiě)表單時(shí),所有的錯(cuò)誤信息都會(huì)顯示在頁(yè)面纵东,你可以實(shí)時(shí)的更正粘招,這個(gè)過(guò)程中你不會(huì)有整個(gè)頁(yè)面的刷新,也不會(huì)有整個(gè)頁(yè)面的提交和等待偎球,當(dāng)你最后點(diǎn)擊提交一切都可以搞定了洒扎。

怎么實(shí)現(xiàn)Ajax技術(shù)呢?

  1. 運(yùn)用HTML和CSS來(lái)實(shí)現(xiàn)頁(yè)面衰絮,表達(dá)信息袍冷;
  2. 運(yùn)用XMLHttpRequest對(duì)象和web服務(wù)器進(jìn)行數(shù)據(jù)的異步交換;
  3. 運(yùn)用JavaScript操作DOM猫牡,實(shí)現(xiàn)動(dòng)態(tài)局部刷新胡诗;

Ajax-XMLHttpRequest對(duì)象創(chuàng)建

目前瀏覽器都支持標(biāo)準(zhǔn)的XHR對(duì)象,也支持標(biāo)準(zhǔn)的構(gòu)造函數(shù)淌友。

但是在IE5和IE6瀏覽器中煌恢,是不支持var request=new XMLHttpRequest();因?yàn)槟菚r(shí)候XHR還未定義。

如何兼容IE5和IE6甚至更早的版本亩进?

var request;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
    request = new XMLHttpRequest();
} else { // code for IE6, IE5
    request = new ActiveXObject("Microsoft.XMLHTTP");
}

只需要判斷下症虑,如果有XHR定義缩歪,我們就使用標(biāo)準(zhǔn)的構(gòu)造函數(shù)归薛,我們直接 new ActiveXObject("Microsoft.XMLHTTP");就可以了。

Ajax-HTTP請(qǐng)求

什么是HTTP

HTTP是計(jì)算機(jī)匪蝙,通過(guò)網(wǎng)絡(luò)進(jìn)行通信的規(guī)則主籍。

它主要使我們客戶(hù),也就是常說(shuō)的瀏覽器能夠從服務(wù)器也就是常說(shuō)的web服務(wù)器逛球,去請(qǐng)求信息和服務(wù)千元。

Paste_Image.png

HTTP是一種無(wú)狀態(tài)的協(xié)議

無(wú)狀態(tài)指的是不建立持久的連接,也就是說(shuō)服務(wù)端不保留連接的一些相關(guān)信息颤绕。

一個(gè)客戶(hù)端幸海,想服務(wù)器發(fā)送請(qǐng)求祟身,然后web服務(wù)器返回響應(yīng),接著連接就被關(guān)閉了物独,這個(gè)處理過(guò)程是沒(méi)有記憶的袜硫。如果后續(xù)的處理需要之前傳遞的一些信息,那么就要重新的傳遞挡篓。這就是經(jīng)常說(shuō)HTTP是一種無(wú)狀態(tài)的協(xié)議婉陷。

概念介紹--HTTP請(qǐng)求

一個(gè)完整的HTTP請(qǐng)求過(guò)程,通常有下面7個(gè)步驟官研。

  1. 建立TCP連接秽澳;

  2. Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求命令;

  3. Web瀏覽器發(fā)送請(qǐng)求頭信息戏羽;

  4. Web服務(wù)器做出應(yīng)答担神;

  5. Web服務(wù)器發(fā)送應(yīng)答頭信息;

  6. Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)始花;

  7. Web服務(wù)器關(guān)閉TCP連接杏瞻;

一個(gè)HTTP請(qǐng)求一般由四部分組成

  1. HTTP請(qǐng)求的方法或動(dòng)作,比如是GIT還是POST請(qǐng)求衙荐;

  2. 正在請(qǐng)求的URL捞挥,總得知道請(qǐng)求的地址是什么吧;

  3. 請(qǐng)求頭忧吟,包含一些客戶(hù)端環(huán)境信息砌函,身份驗(yàn)證信息等;

  4. 請(qǐng)求體溜族,也就是請(qǐng)求正文讹俊,請(qǐng)求正文中可以包含客戶(hù)提交的查詢(xún)字符串信息,表單信息等等煌抒。

Paste_Image.png

GIT請(qǐng)求和POST請(qǐng)求

  • GIT:一般用于信息獲取
    使用URL傳遞參數(shù)
    對(duì)所發(fā)送信息的數(shù)量也有限制仍劈,一般在2000個(gè)字符

  • POST:一般用于修改服務(wù)器上的資源。
    對(duì)所發(fā)送信息的數(shù)量無(wú)限制

HTTP響應(yīng)

一個(gè)HTTP響應(yīng)一般由三部分組成

  1. 一個(gè)數(shù)字和文字組成的狀態(tài)碼寡壮,用來(lái)顯示請(qǐng)求是否成功還是失敺犯怼;

  2. 響應(yīng)頭况既,響應(yīng)頭也和請(qǐng)求頭一樣包含許多有用的信息这溅,例如服務(wù)類(lèi)型,日期時(shí)間棒仍,內(nèi)容類(lèi)型和長(zhǎng)度等悲靴;

  3. 響應(yīng)體,也就是響應(yīng)正文莫其;

Paste_Image.png

HTTP響應(yīng)狀態(tài)碼介紹

HTTP響應(yīng)狀態(tài)碼由3位數(shù)字構(gòu)成癞尚,其中首位數(shù)字定義了狀態(tài)碼的類(lèi)型:

  • 1XX:1開(kāi)頭耸三,信息類(lèi),表示收到web瀏覽器請(qǐng)求浇揩,正在進(jìn)一步的處理中吕晌;

  • 2XX:2開(kāi)頭,成功临燃,表示用戶(hù)請(qǐng)求被正確接收睛驳,理解和處理例如:200 OK;

  • 3XX:3開(kāi)頭膜廊,重定向乏沸,表示請(qǐng)求沒(méi)有成功,客戶(hù)必須采取進(jìn)一步的動(dòng)作爪瓜;

  • 4XX:4開(kāi)頭蹬跃,客戶(hù)端錯(cuò)誤,表示客戶(hù)端提交的請(qǐng)求有錯(cuò)誤铆铆,例如:404 NOT ;

  • Found蝶缀,意味著請(qǐng)求中所引用的文檔不存在;

  • 5XX:5開(kāi)頭薄货,服務(wù)器錯(cuò)誤翁都,表示服務(wù)器不能完成對(duì)請(qǐng)求的處理:如 500;

Ajax-XMLHttpRequest發(fā)送請(qǐng)求

XMLHttpRequest對(duì)象的方法

方法 描述
open(method,url,async) 規(guī)定請(qǐng)求的類(lèi)型、URL 以及是否異步處理請(qǐng)求谅猾。
method:請(qǐng)求的類(lèi)型柄慰;GET 或 POST
url:文件在服務(wù)器上的位置
async:true(異步)或 false(同步)
send(string) 將請(qǐng)求發(fā)送到服務(wù)器。
string:僅用于 POST 請(qǐng)求

GET 請(qǐng)求:

request.open("GET","gte.php",true);
request.send();

POST 請(qǐng)求

request.open("POST","post.php",true);
request.send();

如果需要像 HTML 表單那樣 POST 數(shù)據(jù)税娜,請(qǐng)使用 setRequestHeader() 來(lái)添加 HTTP 頭坐搔。然后在 send() 方法中規(guī)定您希望發(fā)送的數(shù)據(jù):

request.open("POST","create.php",true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send("name=黃&sex=男");
方法 描述
setRequestHeader(header,value) 向請(qǐng)求添加 HTTP 頭。
header: 規(guī)定頭的名稱(chēng)
value: 規(guī)定頭的值

request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
這個(gè)方法其實(shí)要設(shè)置HTTP的頭信息敬矩,告訴web服務(wù)器我們要發(fā)送一個(gè)表單概行,
需要注意的是request.setRequestHeader方法要寫(xiě)在request.openrequest.send中間,否則將會(huì)拋出異常弧岳。

Ajax-XMLHttpRequest取得響應(yīng)

獲得來(lái)自服務(wù)器的響應(yīng)凳忙,請(qǐng)使用 XMLHttpRequest 對(duì)象的 responseText 或 responseXML 屬性。

屬性 描述
responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)缩筛。
responseXML 獲得 XML 形式的響應(yīng)數(shù)據(jù)消略。
status和statueText 以數(shù)字和文本形式返回HTTP狀態(tài)碼堡称。
gitAllResponseHeader() 獲取所有的響應(yīng)報(bào)頭瞎抛。
gieResponseHeader( parameter ) 查詢(xún)響應(yīng)的某個(gè)字段的值。 parameter 要查詢(xún)的字段

onreadystatechange 事件

當(dāng)請(qǐng)求被發(fā)送到服務(wù)器時(shí)却紧,我們需要執(zhí)行一些基于響應(yīng)的任務(wù)桐臊。

每當(dāng) readyState 改變時(shí)胎撤,就會(huì)觸發(fā) onreadystatechange 事件。

readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息断凶。

屬性 描述
onreadystatechange 存儲(chǔ)函數(shù)(或函數(shù)名)伤提,每當(dāng) readyState 屬性改變時(shí),就會(huì)調(diào)用該函數(shù)认烁。
readyState 存有 XMLHttpRequest 的狀態(tài)肿男。從 0 到 4 發(fā)生變化。
0: 請(qǐng)求未初始化
1: 服務(wù)器連接已建立
2: 請(qǐng)求已接收
3: 請(qǐng)求處理中
4: 請(qǐng)求已完成却嗡,且響應(yīng)已就緒
status 200: "OK"
404: 未找到頁(yè)面
function but() {
    var request;
    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
        request = new XMLHttpRequest();
    } else { // code for IE6, IE5
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200) {  //響應(yīng)完成且請(qǐng)求成功
            //做一些事情  request.responseText;
        }
    }
    request.open("GET", "gte.php", true);
    request.send();
}

總結(jié)下Ajax使用的步驟

第一步

new一個(gè)XHM對(duì)象new XMLHttpRequest();

兼容寫(xiě)法

    var request;
    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
        request = new XMLHttpRequest();
    } else { // code for IE6, IE5
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }

第二步

調(diào)用open方法

    request.open("GET", "gte.php", true);

第三步

將請(qǐng)求發(fā)送到服務(wù)器

    request.send();

第四步

對(duì)過(guò)程進(jìn)行監(jiān)聽(tīng)來(lái)知道服務(wù)器是否正確的做出了響應(yīng)舶沛,接著就可以做一些事情

    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200) {  //響應(yīng)完成且請(qǐng)求成功
            //做一些事情  request.responseText;
        }
    }

未完

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窗价,隨后出現(xiàn)的幾起案子如庭,更是在濱河造成了極大的恐慌,老刑警劉巖撼港,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪它,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)净蚤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)踏揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卖擅,你說(shuō)我怎么就攤上這事∧迹” “怎么了惩阶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)扣汪。 經(jīng)常有香客問(wèn)我断楷,道長(zhǎng),這世上最難降的妖魔是什么崭别? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任冬筒,我火速辦了婚禮,結(jié)果婚禮上茅主,老公的妹妹穿的比我還像新娘舞痰。我一直安慰自己,他們只是感情好诀姚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布响牛。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呀打。 梳的紋絲不亂的頭發(fā)上矢赁,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音贬丛,去河邊找鬼撩银。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豺憔,可吹牛的內(nèi)容都是我干的额获。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恭应,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咪啡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起暮屡,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤撤摸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褒纲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體准夷,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年莺掠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衫嵌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻秆,死狀恐怖楔绞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唇兑,我是刑警寧澤酒朵,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站扎附,受9級(jí)特大地震影響蔫耽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留夜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一匙铡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碍粥,春花似錦鳖眼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矿瘦。三九已至,卻和暖如春蜂厅,著一層夾襖步出監(jiān)牢的瞬間匪凡,已是汗流浹背膊畴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工掘猿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唇跨。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓稠通,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親买猖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子改橘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)玉控,斷路器飞主,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 本篇文章篇幅比較長(zhǎng),先來(lái)個(gè)思維導(dǎo)圖預(yù)覽一下高诺。 一碌识、概述 1.計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)分層 2.TCP/IP 通信傳輸流 ...
    滌生_Woo閱讀 54,974評(píng)論 24 557
  • 1. 網(wǎng)絡(luò)基礎(chǔ)TCP/IP HTTP基于TCP/IP協(xié)議族,HTTP屬于它內(nèi)部的一個(gè)子集虱而。 把互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集...
    yozosann閱讀 3,440評(píng)論 0 20
  • 一筏餐、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,335評(píng)論 6 152
  • 賈老師從兜里掏出了一把鋒利的水果刀,拔下刀鞘牡拇,隨手一揮魁瞪,就在自己的右側(cè)胳膊外側(cè)劃了一條足足有六七厘米長(zhǎng)的斜口子。頓...
    樵砥閱讀 270評(píng)論 2 3