摘要:在這個例子中,處理函數(shù)為。保證這些方法一定要是大寫字母,否則其他一些瀏覽器比如可能無法處理這個請求。要重點提到的就是請求返回的是一個,所以對獲取數(shù)據(jù)處理要用。
先參考MDN的什么是AJAX
AJAX是異步的JavaScript和XML(Asynchronous JavaScript And XML)。簡單點說,就是使用 XMLHttpRequest 對象與服務(wù)器通信。 它可以使用JSON,XML,HTML和text文本等格式發(fā)送和接收數(shù)據(jù)。AJAX最吸引人的就是它的“異步”特性,也就是說他可以在不重新刷新頁面的情況下與服務(wù)器通信,交換數(shù)據(jù),或更新頁面。
使用AJAX的兩個特性
在不重新加載頁面的情況下發(fā)送請求給服務(wù)器。
接受并使用從服務(wù)器發(fā)來的數(shù)據(jù)。
AJAX請求過程是什么樣的 先看代碼function request(){ let httpRequest = new XMLHttpRequest(); //要在函數(shù)閉包內(nèi)創(chuàng)建XHR變量,避免被其他request相互覆蓋; if(!httpRequest){ alert("Giving up :( Cannot create an XMLHTTP instance"); return false; } httpRequest.onreadystatechange = alertContents; httpRequest.open("GET", "test.html"); httpRequest.send(); } function alertContents() { if (httpRequest.readyState === XMLHttpRequest.DONE) { if (httpRequest.status === 200) { alert(httpRequest.responseText); } else { alert("There was a problem with the request."); } } }創(chuàng)建XMLHttpRequest對象
let httpRequest = new XMLHttpRequest();什么是onreadystatechange
只要 readyState 屬性發(fā)生變化,就會調(diào)用相應(yīng)的處理函數(shù)。
在這個例子中,處理函數(shù)為alertContents。要注意的是,函數(shù)名后沒有參數(shù),因為你把一個引用賦值給了函數(shù),而不是真正的調(diào)用了它。下面會講關(guān)于這個處理函數(shù)的具體實現(xiàn)。
onreadystatechange顧名思義,每次state變化的時候都會調(diào)用被給的函數(shù),如果只想在狀態(tài)為完成的時候被調(diào)用,可以使用onload來代替。
open() 初始化不管get還是post,都要先open()。
第一個參數(shù)是HTTP請求方法 - 有GET,POST,HEAD以及服務(wù)器支持的其他方法。 保證這些方法一定要是大寫字母,否則其他一些瀏覽器(比如FireFox)可能無法處理這個請求。
第二個參數(shù)是你要發(fā)送的URL。由于安全原因,默認(rèn)不能調(diào)用第三方URL域名。 確保你在頁面中使用的是正確的域名,否則在調(diào)用 open() 方法是會有 “權(quán)限被拒絕” 錯誤提示。一個容易犯的錯誤是你企圖通過 domain.tld 訪問網(wǎng)站,而不是使用 www.domain.tld。
第三個參數(shù)是可選的,用于設(shè)置請求是否是異步的。如果設(shè)為 true (默認(rèn)設(shè)置),JavaScript執(zhí)行會持續(xù),并且在服務(wù)器還沒有響應(yīng)的情況下與頁面進(jìn)行交互。
send() 發(fā)送上面的就是一個get情景中,用send()的例子
再提供一個post例子
post要設(shè)定相應(yīng)的request header,調(diào)用setRequestHeader()
var xhr = new XMLHttpRequest(); xhr.open("POST", "/server", true); //如果要post就要設(shè)定相應(yīng)的request header xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { //這里定義onreadystatechange前面已經(jīng)講過了 if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { // 請求完畢,做一些處理 } } xhr.send("foo=bar&lorem=ipsum");//正式發(fā)送的send()調(diào)用處理onreadystatechange的函數(shù)實現(xiàn)
我們知道會把一個函數(shù)賦予xhr.onreadystatechange。那么這個函數(shù)應(yīng)該做什么?
首先,函數(shù)要檢查請求的狀態(tài)。如果狀態(tài)的值是 XMLHttpRequest.DONE (對應(yīng)的值是4),意味著服務(wù)器響應(yīng)收到了并且是沒問題的,然后就可以繼續(xù)執(zhí)行。
if (httpRequest.readyState === XMLHttpRequest.DONE) { ... } else { ... }
0 UNSENT 還沒open()
1 OPENED 已經(jīng)open()了
2 HEADERS_RECEIVED 已經(jīng)send()了
3 LOADING 獲取返回數(shù)據(jù)中
4 DONE 完成
接下來,檢查HTTP響應(yīng)的 response code。 可能的響應(yīng)碼都已經(jīng)列在表中 W3C響應(yīng)碼列表。在下面的例子中,我們通過檢查響應(yīng)碼 200 OK 區(qū)別對待成功和不成功的AJAX調(diào)用。
if (httpRequest.status === 200) { ... } else { ... }
2XX 成功
3XX 重新導(dǎo)向
4XX 請求有問題
5XX 服務(wù)端有問題
一切檢查后,那么怎么獲取返回數(shù)據(jù)?
httpRequest.responseText – 服務(wù)器以文本字符的形式返回
httpRequest.responseXML – 以 XMLDocument 對象方式返回,之后就可以使用JavaScript來處理
那么經(jīng)??吹降膉query中的ajax是什么樣的?我們平常用jquery的ajax都是傳一個對象,來具體自己想做什么樣的請求。
那么實現(xiàn)ajax的時候,也是先要從這傳進(jìn)來的一個對象里面找參數(shù)。處理完了以后就用這些得到的參數(shù)去做請求就可以了。
function ajax(options){ if(window.XMLHttpRequest){ let xhr = new XMLHttpRequest; }else{ let xhr = new ActiveXObject();//IE6 and oler } //從option獲取一些參數(shù) let method = options.type || "GET"; let dataType = options.dataType || "application/x-www-form-urlencoded"; let params = options.data; let success = options.success; let fail = option.fail; ... //設(shè)置onreadystatechange xhr.onreadystatechange = function(){ if(xhr.readyState === 4 && xhr.status === 200){ //call success }else{ //call fail } } //正式進(jìn)行請求 if(method == "GET){ xhr.open("GET",url + "?" + params,true); xhr.send(); }else if(method == "POST"){ xhr.open("POST",url, true); xhr.setRequestHeader("Content-Type", dataType); xhr.send(params); }else{ ...other method handler } }當(dāng)然還可以fetch
Fetch 是瀏覽器提供的原生 AJAX 接口。這里不做過多介紹。
要重點提到的就是fetch請求返回的是一個Promise,所以對獲取數(shù)據(jù)處理要用then()。
fetch("/data.json") .then(res => { res.text() // response body (=> 還是返回Promise,需要再then()) res.json() // parse via JSON (=> 還是返回Promise,需要再then()) res.status //=> 200 res.statusText //=> "OK" res.redirected //=> false res.ok //=> true res.url //=> "http://site.com/data.json" res.type //=> "basic" // ("cors" "default" "error" // "opaque" "opaqueredirect") res.headers.get("Content-Type") })
參考信息
MDN 什么是AJAX?
MDN XMLHttpRequest
阮一峰ES6指南 Promise對象
fetch cheatsheet
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102037.html
摘要:創(chuàng)建對象指定響應(yīng)函數(shù)打開連接指定請求發(fā)送請求創(chuàng)建響應(yīng)函數(shù)注第三步是使用對象的方法,字面意思是打開的意思,即打開連接。 前言 博主博客:Stillwater的博客知乎專欄:前端汪汪本文為作者原創(chuàng)轉(zhuǎn)載請注明出處:http://hiztx.top/2017/01/12/a... 在前端面試的時候經(jīng)常會有如下情景。AJAX會嗎?能不能手寫個AJAX?第一個問題可以參見我的另一篇博客,AJAX...
摘要:使用它可以讓頁面請求少量的數(shù)據(jù),而不用刷新整個頁面?;谑裁创鹚诘氖恰5膸齑鸹谏厦娴脑?,各種庫引用而生,然而最有名的就是的中的。它的一個優(yōu)勢異步操作,但的異步操作是基于事件的異步模型,沒有那么友好。 歡迎訪問我的個人博客:http://www.xiaolongwu.cn 基本知識 1. Ajax是什么? 答:Ajax是一種可以在瀏覽器和服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請求)...
摘要:是最重要特性之一,它是目前為止最佳的異步解決方案了。雖然沒有在中錄入,但很快就到來,目前已經(jīng)在階段。表示暫停,表示執(zhí)行下一步,如果你不了解也沒關(guān)系,可以忽略它直接學(xué)習(xí)。 await/async 是 ES7 最重要特性之一,它是目前為止 JS 最佳的異步解決方案了。雖然沒有在 ES2016 中錄入,但很快就到來,目前已經(jīng)在 ES-Next Stage 4 階段。 直接上例子,比如我們需要...
摘要:例如處理請求的線程處理事件的線程定時器線程讀寫文件的線程例如在中等等。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊列中取消息執(zhí)行的過程。事件觸發(fā)時,表示異步任務(wù)完成,會將事件監(jiān)聽器函數(shù)封裝成一條消息放到消息隊列中,等待主線程執(zhí)行。 一. 單線程 我們常說JavaScript是單線程的。 所謂單線程,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個。不妨叫它主線程。 但是實...
摘要:也在年發(fā)布了它的國際標(biāo)準(zhǔn)。能夠返回具體數(shù)字代表看上面的文檔,表示服務(wù)器返回的數(shù)據(jù)已經(jīng)完全接收,或者本次接收已經(jīng)失敗。請求結(jié)束,處理服務(wù)器返回的數(shù)據(jù)顯示提示加載中上面代碼中,等于時,表明腳本發(fā)出的請求已經(jīng)成功。其他情況,都表示請求還在進(jìn)行中。 Ajax學(xué)習(xí)與理解 想要學(xué)習(xí)的Ajax內(nèi)容都在這個教程阮一峰javascript--XMLHttpRequest 對象應(yīng)該注意的點 JS 是一門...
閱讀 1210·2021-11-10 11:35
閱讀 2951·2021-09-24 10:35
閱讀 2975·2021-09-22 15:38
閱讀 2815·2019-08-30 15:43
閱讀 1349·2019-08-29 18:39
閱讀 2592·2019-08-29 15:22
閱讀 2802·2019-08-28 18:17
閱讀 619·2019-08-26 13:37