摘要:本文主要是我學習的筆記,不涉及到原理,只是記錄如何使用。成功的含義取決于方法資源已被提取并在消息正文中傳輸。是請求鏈接到服務器,服務器響應錯誤后服務器返回瀏覽器的狀態碼。是指響應時間,開始請求到接收到響應開始處理的時間,單位為。
本文主要是我學習ajax的筆記,不涉及到原理,只是記錄如何使用。如果有錯歡迎各位大佬指出。提前先轉一篇寫的非常全面的博客你真的會使用XMLHttpRequest嗎?
一、ajax概念1、ajax是Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。它依賴的是現有的CSS/HTML/Javascript,ajax依靠瀏覽器提供的XMLHttpRequest對象讓瀏覽器發出HTTP請求與接收HTTP響應,實現在頁面不刷新的情況下和服務端進行數據交互
2、依靠對象
XMLHttpRequest對象
fetch對象 (兼容性較弱)
我在當前html文件下偽造了一個hello.json的文檔,作為服務器資源。
控制臺報錯,顯示用file協議是不支持的,跨源請求僅支持http, data, chrome, chrome-extension, https協議方案
所以我們打開終端gitbash,切換到html當前文件下,輸入http-server打開本地服務器
打開服務器后,返回兩個地址,125的地址是本地局域網環境的 ip,127的ip是本機 ip。
這兩個地址的區別,可以點擊這個鏈接查看
復制這個IP地址到瀏覽器上,打開對應的html文件,得到了對應的ajax數據
采用同步的方式,也能獲得數據,但是時間比較長,差不多22ms(個人電腦上的數據,并非實驗數據),效率不高。
把參數三把false改成true,就可以變異步。xhrsend之后立刻就執行返回數據的操作,導致沒有數據返回。
如果需要采用異步的方式獲取ajax數據,就需要綁定load事件,等加載后再執行var data= xhr.responseText,才返回數據
異步綁定數據,需要綁定load事件
var xhr =new XMLHttpRequest() // xhr.open("GET","hello.json",true) // xhr.send() // xhr.addEventListener("load",function(){ // var data= xhr.responseText // console.log(data) // console.log(xhr.status) // })四、xhr.status 1、概念
status是XMLHttpRequest對象的一個屬性,表示響應的HTTP狀態碼。
該狀態碼用于表示特定 HTTP 請求是否已成功完成,這個狀態碼是服務器發給瀏覽器的
這篇博客(Ajax關于readyState(狀態值)和status(狀態碼)的研究) 上寫status其余狀態碼比較詳細
也可以查閱mdn,我這里只是挑出幾個常用的狀態碼
3.1) 200 請求成功。成功的含義取決于HTTP方法:
GET:資源已被提取并在消息正文中傳輸。
HEAD:實體標頭位于消息正文中。
POST:描述動作結果的資源在消息體中傳輸。
TRACE:消息正文包含服務器收到的請求消息
3.2)404 Not Found
請求失敗,被廣泛應用于當服務器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。
3.3)304 Not Modified(未改變)
如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)并沒有改變,則服務器應當返回這個狀態碼
未改變說明無需再次傳輸請求的內容,也就是說可以使用緩存的內容。
var xhr= new XMLHttpRequest() xhr.timeout=13 // 注意timeout時間要根據收到json文件響應時間來設置,小于這個時間會輸出timeout xhr.open("GET","hello.json",true) xhr.send() xhr.addEventListener("load",function(){ console.log(xhr.status) if((xhr.status>=200 && xhr.status<300)||xhr.status==304){ console.log(this.responseText) }else{ console.log("fail") } }) xhr.ontimeout=function(e){ console.log("timeout") } xhr.onerror=function(){ console.log("error")//一般是連接失敗報錯 }
坑1:onerror和status中的錯誤狀態的區別
onerror是定義一個事件,當ajax連接失敗(瀏覽器發送ajax請求根本沒有連接到服務器)瀏覽器自己輸出error。status是請求鏈接到服務器,服務器響應錯誤后服務器返回瀏覽器的狀態碼。詳情可以查看這個鏈接
坑2:XMLHttpRequest提供了timeout的屬性,為了防止請求過了很久還沒有成功,白白占用的網絡資源。timeout是指響應時間,開始請求到接收到響應(開始處理)的時間,單位為ms。
比如我設置timeout時間為5ms
結果請求超時,返回的是timeout
timeout對應console臺,應該是以下紅框的總時間。
timing時間各個時間解析
XMLHttpRequest 的一個屬性,用來表示當前XMLHttpRequest對象處于什么狀態
有5個值,mdn的解析
0 | 初始化,XMLHttpRequest對象還沒有完成初始化(但尚未調用 open() 方法) |
---|---|
1 | 載入,XMLHttpRequest對象開始發送請求 |
2 | 載入完成,XMLHttpRequest對象的請求發送完成 |
3 | 下載解析中,XMLHttpRequest對象開始讀取服務器的響應 |
4 | 完成,XMLHttpRequest對象讀取服務器響應結束 |
var xhr= new XMLHttpRequest() xhr.open("GET","hello.json",true) xhr.send() xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ // redyState的s一定要大寫,不然不輸出,但綁定事件的onreadystatechange是小寫 if((xhr.status>=200 && xhr.status<300 ) ||xhr.status==304){ console.log(xhr.responseText) }else{ console.log("fail") }} }
執行結果
每次readystatechange,都會觸發事件,輸出readystate
redyState的s一定要大寫,不然不輸出,但綁定事件的onreadystatechange是小寫
六、get和post方式參數的位置get方式會把參數拼裝成url后
post會把參數放在xhr.send()內部
var xhr = new XMLHttpRequest() xhr.timeout = 3000 //可選,設置xhr請求的超時時間 xhr.open("POST", "/register", true) xhr.onload = function(e) { if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ console.log(this.responseText) } } //可選 xhr.ontimeout = function(e) { console.log("請求超時") } //可選 xhr.onerror = function(e) { console.log("連接失敗") } //可選 xhr.upload.onprogress = function(e) { //如果是上傳文件,可以獲取上傳進度 } xhr.send("username=jirengu&password=123456")七、封裝一個 ajax對象
function ajax(opts){ var url = opts.url var type = opts.type || "GET" var dataType = opts.dataType || "json" var onsuccess = opts.onsuccess || function(){} var onerror = opts.onerror || function(){} var data = opts.data || {} var dataStr = [] for(var key in data){ dataStr.push(key + "=" + data[key]) } dataStr = dataStr.join("&") if(type === "GET"){ url += "?" + dataStr } var xhr = new XMLHttpRequest() xhr.open(type, url, true) xhr.onload = function(){ if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ //成功了 if(dataType === "json"){ onsuccess( JSON.parse(xhr.responseText)) }else{ onsuccess( xhr.responseText) } } else { onerror() } } xhr.onerror = onerror if(type === "POST"){ xhr.send(dataStr) }else{ xhr.send() } } ajax({ url: "http://api.jirengu.com/weather.php", data: { city: "北京" }, onsuccess: function(ret){ console.log(ret) }, onerror: function(){ console.log("服務器異常") } })
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99590.html
摘要:異步請求線程在在連接后是通過瀏覽器新開一個線程請求將檢測到狀態變更時,如果設置有回調函數,異步線程就產生狀態變更事件,將這個回調再放入事件循環隊列中。 基礎:瀏覽器 -- 多進程,每個tab頁獨立一個瀏覽器渲染進程(瀏覽器內核) 每個瀏覽器渲染進程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內核,負責處理Javascript腳本程序。(例如V8引擎) JS引擎線程負...
摘要:抱歉,最近忙,本篇等有時間更新。引言本文基于框架做的一個生成和存儲,主要目的是學習使用框架。書籍基于的,學習時使用框架開發。開發環境備注一直想把這本書的個作為系列分享出來,供初學者學習玩玩。 抱歉,最近忙,本篇等有時間更新。 引言 本文基于Laravel框架做的一個URL生成和存儲demo,主要目的是學習使用Laravel框架。內容基于英文書籍《Packt.Laravel.Applic...
摘要:技術的核心是對象即。收到響應后,響應的數據會自動填充對象的屬性,相關的屬性有作為響應主體被返回的文本。收到響應后,一般來說,會先判斷是否為,這是此次請求成功的標志。中的版本會將設置為,而中原生的則會將規范化為。會在取得時報告的值為。 Ajax(Asynchronous Javascript + XML)技術的核心是XMLHttpRequest對象,即: XHR。雖然名字中包含XML,但...
閱讀 1415·2021-11-25 09:43
閱讀 2273·2021-09-27 13:36
閱讀 1126·2021-09-04 16:40
閱讀 1965·2019-08-30 11:12
閱讀 3323·2019-08-29 14:14
閱讀 576·2019-08-28 17:56
閱讀 1336·2019-08-26 13:50
閱讀 1260·2019-08-26 13:29