摘要:狀態(tài)值和狀態(tài)碼的區(qū)別,是指運(yùn)行所經(jīng)歷過的幾種狀態(tài),無(wú)論訪問是否成功都將響應(yīng)的步驟,可以理解成為運(yùn)行步驟,使用獲得。
var xhr = createXHR(); xhr.onreadystatechange =function(){ if (xhr.readyState==4) { if ((xhr.status>=200&&xhr.status<300)||xhr.status==304) { alert(xhr.responseText); }else { alert("Request was unsuccessful:"+xhr.status); } } }; xhr.open("get","http://120.78.164.247:9999/user/findAll", false); xhr.send(null);
1.Ajax:readyState(狀態(tài)值)和status(狀態(tài)碼)的區(qū)別
readyState,是指運(yùn)行Ajax所經(jīng)歷過的幾種狀態(tài),無(wú)論訪問是否成功都將響應(yīng)的步驟,可以理解成為Ajax運(yùn)行步驟,使用“ajax.readyState”獲得。
status,是指無(wú)論Ajax訪問是否成功,由http協(xié)議根據(jù)所提交的信息,服務(wù)器所返回的http頭信息代碼,使用“ajax.status”獲得。
總體理解:可以簡(jiǎn)單的理解為state代表一個(gè)整體的狀態(tài)。而status是這個(gè)大的state下面具體的小的狀態(tài)。
2.什么是readyState
readyState是XMLHttpRequest對(duì)象的一個(gè)屬性,用來(lái)標(biāo)識(shí)當(dāng)前XMLHttpRequest對(duì)象處于什么狀態(tài)。
readyState總共有5個(gè)狀態(tài)值,分別為0~4,每個(gè)值代表了不同的含義。
0:初始化,XMLHttpRequest對(duì)象還沒有完成初始化 1:載入,XMLHttpRequest對(duì)象開始發(fā)送請(qǐng)求 2:載入完成,XMLHttpRequest對(duì)象的請(qǐng)求發(fā)送完成 3:解析,XMLHttpRequest對(duì)象開始讀取服務(wù)器的響應(yīng) 4:完成,XMLHttpRequest對(duì)象讀取服務(wù)器響應(yīng)結(jié)束
3.什么是status
status是XMLHttpRequest對(duì)象的一個(gè)屬性,表示響應(yīng)的http狀態(tài)碼
在http1.1協(xié)議下,http狀態(tài)碼總共可分為5大類
1xx:信息響應(yīng)類,表示接收到請(qǐng)求并且繼續(xù)處理 2xx:處理成功響應(yīng)類,表示動(dòng)作被成功接收、理解和接受 3xx:重定向響應(yīng)類,為了完成指定的動(dòng)作,必須接受進(jìn)一步處理 4xx:客戶端錯(cuò)誤,客戶請(qǐng)求包含語(yǔ)法錯(cuò)誤或者是不能正確執(zhí)行 5xx:服務(wù)端錯(cuò)誤,服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求 100——客戶必須繼續(xù)發(fā)出請(qǐng)求 101——客戶要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換HTTP協(xié)議版本 200——交易成功 201——提示知道新文件的URL 202——接受和處理、但處理未完成 203——返回信息不確定或不完整 204——請(qǐng)求收到,但返回信息為空 205——服務(wù)器完成了請(qǐng)求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件 206——服務(wù)器已經(jīng)完成了部分用戶的GET請(qǐng)求 300——請(qǐng)求的資源可在多處得到 301——?jiǎng)h除請(qǐng)求數(shù)據(jù) 302——在其他地址發(fā)現(xiàn)了請(qǐng)求數(shù)據(jù) 303——建議客戶訪問其他URL或訪問方式 304——客戶端已經(jīng)執(zhí)行了GET,但文件未變化 305——請(qǐng)求的資源必須從服務(wù)器指定的地址得到 306——前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用 307——申明請(qǐng)求的資源臨時(shí)性刪除 400——錯(cuò)誤請(qǐng)求,如語(yǔ)法錯(cuò)誤 401——請(qǐng)求授權(quán)失敗 402——保留有效ChargeTo頭響應(yīng) 403——請(qǐng)求不允許 404——沒有發(fā)現(xiàn)文件、查詢或URl 405——用戶在Request-Line字段定義的方法不允許 406——根據(jù)用戶發(fā)送的Accept拖,請(qǐng)求資源不可訪問 407——類似401,用戶必須首先在代理服務(wù)器上得到授權(quán) 408——客戶端沒有在用戶指定的餓時(shí)間內(nèi)完成請(qǐng)求 409——對(duì)當(dāng)前資源狀態(tài),請(qǐng)求不能完成 410——服務(wù)器上不再有此資源且無(wú)進(jìn)一步的參考地址 411——服務(wù)器拒絕用戶定義的Content-Length屬性請(qǐng)求 412——一個(gè)或多個(gè)請(qǐng)求頭字段在當(dāng)前請(qǐng)求中錯(cuò)誤 413——請(qǐng)求的資源大于服務(wù)器允許的大小 414——請(qǐng)求的資源URL長(zhǎng)于服務(wù)器允許的長(zhǎng)度 415——請(qǐng)求資源不支持請(qǐng)求項(xiàng)目格式 416——請(qǐng)求中包含Range請(qǐng)求頭字段,在當(dāng)前請(qǐng)求資源范圍內(nèi)沒有range指示值,請(qǐng)求也不包含If-Range請(qǐng)求頭字段 417——服務(wù)器不滿足請(qǐng)求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿足請(qǐng)求 500——服務(wù)器產(chǎn)生內(nèi)部錯(cuò)誤 501——服務(wù)器不支持請(qǐng)求的函數(shù) 502——服務(wù)器暫時(shí)不可用,有時(shí)是為了防止發(fā)生系統(tǒng)過載 503——服務(wù)器過載或暫停維修 504——關(guān)口過載,服務(wù)器使用另一個(gè)關(guān)口或服務(wù)來(lái)響應(yīng)用戶,等待時(shí)間設(shè)定值較長(zhǎng) 505——服務(wù)器不支持或拒絕支請(qǐng)求頭中指定的HTTP版本
思考問題:為什么onreadystatechange的函數(shù)實(shí)現(xiàn)要同時(shí)判斷readyState和status呢?
第一種思考方式:只使用readyState判斷
var xhr = createXHR(); xhr.onreadystatechange =function(){ if (xhr.readyState==4) { alert(xhr.responseText); }else { alert("Request was unsuccessful:"+xhr.status); } }; xhr.open("get","http://120.78.164.247:9999/user/findAll", false); xhr.send(null);
服務(wù)響應(yīng)出錯(cuò)了,但還是返回了信息,這并不是我們想要的結(jié)果。如果返回不是200,而是404或者500,由于只使用readystate做判斷,它不理會(huì)放回的結(jié)果是200、404還是500,只要響應(yīng)成功返回了,就執(zhí)行接下來(lái)的javascript代碼,結(jié)果將造成各種不可預(yù)料的錯(cuò)誤。所以只使用readyState判斷是行不通的。
第二種思考方式:只使用status判斷
var xhr = createXHR(); xhr.onreadystatechange =function(){ if ((xhr.status>=200&&xhr.status<300)||xhr.status==304) { alert(xhr.responseText); }else { alert("Request was unsuccessful:"+xhr.status); } }; xhr.open("get","http://120.78.164.247:9999/user/findAll", false); xhr.send(null);
事實(shí)上,結(jié)果并不像預(yù)期那樣。響應(yīng)碼確實(shí)是返回了200,但是總共彈出了3次窗口!第一次是“readyState=2”的窗口,第二次是“readyState=3”的窗口,第三次是“readyState=4”的窗口。由此,可見onreadystatechange函數(shù)的執(zhí)行不是只在readyState變?yōu)?的時(shí)候觸發(fā)的,而是readyState(2、3、4)的每次變化都會(huì)觸發(fā),所以就出現(xiàn)了前面說的那種情況。可見,多帶帶使用status判斷也是行不通的。
5.由上面的試驗(yàn),我們可以知道判斷的時(shí)候readyState和status缺一不可。那么readyState和status的先后判斷順序會(huì)不會(huì)有影響呢?我們可以將status調(diào)到前面先判斷。
事實(shí)上,這對(duì)于最終的結(jié)果是沒有影響的,但是中間的性能就不同了。由試驗(yàn)我們知道,readyState的每次變化都會(huì)觸發(fā)onreadystatechange函數(shù),假如先判斷status,那么每次都會(huì)多判斷一次status的狀態(tài)。雖然性能上影響甚微,不過還是應(yīng)該抱著追求極致代碼的想法,把readyState的判斷放在前面。
祝大家早日富可敵國(guó),bye~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98302.html
摘要:二技術(shù)的核心技術(shù)的核心是對(duì)象簡(jiǎn)稱,使得瀏覽器可以發(fā)出請(qǐng)求與接收響應(yīng)。伴隨狀態(tài)碼的字符串信息。第二部分請(qǐng)求頭部,第二行至第六行。第四部分請(qǐng)求數(shù)據(jù),第八行。例子第一部分狀態(tài)行,由協(xié)議版本號(hào),狀態(tài)碼,狀態(tài)消息三部分組成。 一、什么是Ajax Ajax的全稱是Asynchronous JavaScript and XML,即異步JavaScript+XML。 二、Ajax技術(shù)的核心 Ajax技...
摘要:隨后也跟進(jìn)抄襲了,取名,并被納入規(guī)范全稱翻譯成中文異步的和技術(shù)的核心是對(duì)象簡(jiǎn)稱,可以在不刷新頁(yè)面頁(yè)面也能取得新的數(shù)據(jù)。注意請(qǐng)求和響應(yīng)都不包含信息。 JSONP發(fā)展 了解了JSONP技術(shù)棧后,知道了JSONP是AJAX出現(xiàn)之前后端交互最好的解決方案,但它依然沒解決問題,用JSONP只能發(fā)送GET請(qǐng)求,不能發(fā)其他請(qǐng)求 form表單可以發(fā)GET請(qǐng)求,也可以發(fā)POST請(qǐng)求,POST請(qǐng)求沒有請(qǐng)求...
摘要:這類狀態(tài)碼代表了客戶端看起來(lái)可能發(fā)生錯(cuò)誤,妨礙了服務(wù)器的處理。 Ajax及其工作原理 AJAX 是一種與服務(wù)器交換數(shù)據(jù)無(wú)需刷新網(wǎng)頁(yè)的技術(shù),最早由Google公司在谷歌地圖里使用,并迅速風(fēng)靡。 AJAX是不能跨域的,如需跨域,可以使用document.domain=a.com;或者使用服務(wù)器代理,代理XMLHttpRequest文件 AJAX是基于現(xiàn)有的Internet標(biāo)準(zhǔn),并且聯(lián)合使用...
摘要:當(dāng)客戶端收到以上信息后,首先要判斷狀態(tài)碼來(lái)確認(rèn)響應(yīng)是否成功,狀態(tài)碼在之間表示請(qǐng)求成功,同時(shí)代表請(qǐng)求資源未被修改,可使用瀏覽器本地緩存。校驗(yàn)狀態(tài)碼輸出響應(yīng)的文本打印其他狀態(tài)碼發(fā)送異步請(qǐng)求如果將方法的第三個(gè)參數(shù)設(shè)為,即為異步請(qǐng)求。 Ajax用一句話來(lái)說就是無(wú)須刷新頁(yè)面即可從服務(wù)器取得數(shù)據(jù)。注意,雖然Ajax翻譯過來(lái)叫異步JavaScript與XML,但是獲得的數(shù)據(jù)不一定是XML數(shù)據(jù),現(xiàn)在服...
摘要:發(fā)送后等待服務(wù)端響應(yīng),響應(yīng)是以觸發(fā)事件來(lái)通知,隨后通過請(qǐng)求對(duì)象實(shí)例拿到狀態(tài)以及響應(yīng)的內(nèi)容。表示服務(wù)器響應(yīng)內(nèi)容的文本形式。而是在調(diào)用發(fā)出后,被調(diào)用者通過觸發(fā)事件,調(diào)用事件處理回調(diào)函數(shù)。 Ajax是什么 AJAX即Asynchronous JavaScript and XML(異步的JavaScript與XML技術(shù)),指的是一套綜合了多項(xiàng)技術(shù)的瀏覽器端網(wǎng)頁(yè)開發(fā)技術(shù),包含了HTML、CSS、...
閱讀 2329·2021-11-23 09:51
閱讀 1106·2021-11-18 10:02
閱讀 3510·2021-10-13 09:49
閱讀 1356·2021-09-22 14:57
閱讀 12250·2021-08-18 10:20
閱讀 1247·2019-08-30 15:55
閱讀 2297·2019-08-29 16:06
閱讀 3314·2019-08-29 11:14