前端程序開發之中咱們經常須要使用到ajax請求。本文內容咱們將會詳細的學習咱們的ajax請求的內容。爭取能夠理解的透透的,讓它成爲咱們開發之中的利器。咱們這裏全部的實例都是以IE9以上的(包括IE9)版本爲基礎的,IE9如下的版本就再也不多作闡述。html
爲何會有ajax呢,ajax的全名是Asynchronous Javascript And XML And HTML
。意思是異步的js,xml和html。再ajax的技術沒有出現以前呢,咱們的網頁在請求後端的數據以後只能全頁面刷新,這就表示全頁面須要從新加載,這樣將會消耗咱們很大量的資源,而且頁面的展現效果十分的很差。ajax就是爲了處理之一問題而來,其是一種用於快速的建立動態頁面的技術,無需從新加載整個頁面只是對頁面上的部份內容進行動態的更新。這樣將會大大的減小咱們的資源消耗,和用戶的等待時長。前端
從上面這段話咱們能夠了解到:ajax
因此咱們能夠這樣的去理接ajax。它是一種異步的算法,用於後臺給出的新數據體緩原有數據展現到頁面上的方式。它不是一種新的語言。因此ajax技術能夠有一個流程如此: 請求後臺數據 --> 數據篩選處理 --> dom進行頁面內容的替換展現。算法
XMLHttpRequest是繼承於XMLHttpRequestEventTarget的,而XMLHttpRequestEventTarget繼承與EventTarget的,因此咱們能夠知道XMLHttpRequest是有本身的事件能夠監聽的。並且它不只僅支持http,同時也支持ftp等請求協議的。後端
咱們先來講一說他的屬性吧:跨域
readyState:咱們以後要經常接觸到的一個屬性,表示請求狀態碼,請求分爲5種狀態: 瀏覽器
response: 返回響應的正文部分,其類型主要是responseType進行控制的,在readyState狀態是4以後能夠進行內容的獲取。bash
responseType: 返回響應正文的類型,在請求對象調用open以後能夠進行設置,設置好以後經過send發出,當設置了返回正文類型的時候,若是服務器給定的值不是這一類型的時候,response將會是null。還有就是各一個同步請求設置返回類型的時候會出現InvalidAccessError。咱們來看一下可選類型吧: 服務器
responseText:返回一個DOMString屬性的值,若是response不是text或者"",那麼將會報InvalidAccessError。cookie
responseUrl: 返回序列化的URL,若是URL有錨點,則#以後的內容會被刪除。若是有重定向,responseURL的值是通過屢次重定向以後的最終的URL。
status:返回響應之中的數字狀態碼,就是那些個200,404等等。
statusText:對應於status的說明。
timeout:用於設置請求超時時長。單位是毫秒數。
withCredentials:布爾類型,它指示了是否該使用相似cookies,authorization headers(頭部受權)或者TLS客戶端證書這一類資格證書來建立一個跨站點訪問控制(cross-site Access-Control)請求。在同一個站點下使用withCredentials屬性是無效的。此外,這個指示也會被用作響應中cookies 被忽視的標示。默認值是false。
接下來是方法一覽:
最後咱們要來了解一下事件內容:
說了這麼多怎麼能夠沒有一個完整的例子,代碼伺候:
ajax: (method, URL) => {
let request = new XMLHttpRequest();
request.onreadystatechange = (e) => {
if(request.readyState === request.UNSENT){
console.log("尚未調用open方法");
}
else if(request.readyState === request.OPENED){
request.timeout = 2000 //設置請求超時時長
request.withCredentials = true //設置跨域受權
request.overrideMimeType('text/plain') //設置MIME類型
// request.setRequestHeader(header, value) 能夠設置請求頭的信息內容。
request.responseType = "text"
}
else if(request.readyState === request.HEADERS_RECEIVED){
console.log("已經獲取了響應頭部")
}
else if(request.readyState === request.LOADING){
console.log("還在讀取返回體內容")
}
else if(request.readyState === request.DONE){
console.log(request.status)
console.log(request.response)
console.log(request.responseText)
console.log(request.responseXML)
}
}
request.onloadstart = (e) => {
console.log("loadstart 觸發了")
}
request.onload = (e) => {
console.log(request.responseURL);
}
request.onloadend = (e) => {
console.log("loadend 觸發了")
}
request.onerror = (err) => {
console.log(err);
}
request.onabort = (e) => {
console.log('請求已經終止');
}
request.ontimeout = () => {
console.log('請求已經超時了')
}
request.open(method, URL)
request.send()
return request;
}
複製代碼
咱們使用mock.js來模擬請求。
本駢文站針對ajax作了一個基礎講解,以後的跨與問題等等咱們將會統一的在後面的跨域問題總綱之中進行學習總結,望共同窗習共同進步,拜拜