好程式設計師web前端培訓分享JavaScript學習筆記ajax及ajax封裝
好程式設計師 web前端培訓分享 JavaScript學習筆記ajax及ajax封裝 , ajax 全名 async javascript and XML
是前後臺互動的能力
也就是我們客戶端給服務端傳送訊息的工具,以及接受響應的工具
是一個 預設非同步 執行機制的功能
AJAX 的優勢
00001. 不需要外掛的支援,原生 js 就可以使用
00002. 使用者體驗好(不需要重新整理頁面就可以更新資料)
00003. 減輕服務端和頻寬的負擔
00004. 缺點: 搜尋引擎的支援度不夠,因為資料都不在頁面上,搜尋引擎搜尋不到
AJAX 的使用
· 在 js 中有內建的建構函式來建立 ajax 物件
· 建立 ajax 物件以後,我們就使用 ajax 物件的方法去傳送請求和接受響應
建立一個 ajax 物件
// IE9及以上 const xhr = new XMLHttpRequest() // IE9以下 const xhr = new ActiveXObject( 'Mricosoft.XMLHTTP' )
· 上面就是有了一個 ajax 物件
· 我們就可以使用這個 xhr 物件來傳送 ajax 請求了
配置連結資訊
const xhr = new XMLHttpRequest() // xhr 物件中的 open 方法是來配置請求資訊的// 第一個引數是本次請求的請求方式 get / post / put / ...// 第二個引數是本次請求的 url // 第三個引數是本次請求是否非同步,預設 true 表示非同步,false 表示同步// xhr.open('請求方式', '請求地址', 是否非同步) xhr.open( 'get' , './data.php' )
· 上面的程式碼執行完畢以後,本次請求的基本配置資訊就寫完了
傳送請求
const xhr = new XMLHttpRequest()xhr.open( 'get' , './data.php' ) // 使用 xhr 物件中的 send 方法來傳送請求 xhr.send()
· 上面程式碼是把配置好資訊的 ajax 物件傳送到服務端
一個基本的 ajax 請求
· 一個最基本的 ajax 請求就是上面三步
· 但是光有上面的三個步驟,我們確實能把請求傳送的到服務端
· 如果服務端正常的話,響應也能回到客戶端
· 但是我們拿不到響應
· 如果想拿到響應,我們有兩個前提條件
00001. 本次 HTTP 請求是成功的,也就是我們之前說的 http 狀態碼為 200 ~ 299
00002. ajax 物件也有自己的狀態碼,用來表示本次 ajax 請求中各個階段
ajax 狀態碼
· ajax 狀態碼 - xhr.readyState
· 是用來表示一個 ajax 請求的全部過程中的某一個狀態
· readyState === 0 : 表示未初始化完成,也就是 open 方法還沒有執行
· readyState === 1 : 表示配置資訊已經完成,也就是執行完 open 之後
· readyState === 2 : 表示 send 方法已經執行完成
· readyState === 3 : 表示正在解析響應內容
· readyState === 4 : 表示響應內容已經解析完畢,可以在客戶端使用了
· 這個時候我們就會發現,當一個 ajax 請求的全部過程中,只有當 readyState === 4 的時候,我們才可以正常使用服務端給我們的資料
· 所以,配合 http 狀態碼為 200 ~ 299
· 一個 ajax 物件中有一個成員叫做 xhr.status
· 這個成員就是記錄本次請求的 http 狀態碼的
· 兩個條件都滿足的時候,才是本次請求正常完成
readyStateChange
· 在 ajax 物件中有一個事件,叫做 readyStateChange 事件
· 這個事件是專門用來監聽 ajax 物件的 readyState 值改變的的行為
· 也就是說只要 readyState 的值發生變化了,那麼就會觸發該事件
· 所以我們就在這個事件中來監聽 ajax 的 readyState 是不是到 4 了
const xhr = new XMLHttpRequest()xhr.open( 'get' , './data.php' ) xhr.send() xhr.onreadyStateChange = function () {
// 每次 readyState 改變的時候都會觸發該事件 // 我們就在這裡判斷 readyState 的值是不是到 4 // 並且 http 的狀態碼是不是 200 ~ 299 if (xhr.readyState === 4 && /^2\d{2|$/ .test(xhr.status)) {
// 這裡表示驗證透過 // 我們就可以獲取服務端給我們響應的內容了 }}
responseText
· ajax 物件中的 responseText 成員
· 就是用來記錄服務端給我們的響應體內容的
· 所以我們就用這個成員來獲取響應體內容就可以
const xhr = new XMLHttpRequest()xhr.open( 'get' , './data.php' ) xhr.send() xhr.onreadyStateChange = function () {
if (xhr.readyState === 4 && /^2\d{2|$/ .test(xhr.status)) {
// 我們在這裡直接列印 xhr.responseText 來檢視服務端給我們返回的內容 console.log(xhr.responseText)
}}
使用 ajax 傳送請求時攜帶引數
· 我們使用 ajax 傳送請求也是可以攜帶引數的
· 引數就是和後臺互動的時候給他的一些資訊
· 但是攜帶引數 get 和 post 兩個方式還是有區別的
傳送一個帶有引數的 get 請求
· get 請求的引數就直接在 url 後面進行拼接就可以
const xhr = new XMLHttpRequest() // 直接在地址後面加一個 ?,然後以 key=value 的形式傳遞// 兩個資料之間以 & 分割 xhr.open( 'get' , './data.php?a=100&b=200' ) xhr.send()
· 這樣服務端就能接受到兩個引數
· 一個是 a,值是 100
· 一個是 b,值是 200
傳送一個帶有引數的 post 請求
· post 請求的引數是攜帶在請求體中的,所以不需要再 url 後面拼接
const xhr = new XMLHttpRequest()xhr.open( 'post' , './data.php' ) // 如果是用 ajax 物件傳送 post 請求,必須要先設定一下請求頭中的 content-type// 告訴一下服務端我給你的是一個什麼樣子的資料格式 xhr.setRequestHeader( 'content-type' , 'application/x-www-form-urlencoded' ) // 請求體直接再 send 的時候寫在 () 裡面就行// 不需要問號,直接就是 'key=value&key=value' 的形式 xhr.send( 'a=100&b=200' )
· application/x-www-form-urlencoded 表示的資料格式就是 key=value&key=value
同源策略
· 同源策略是由瀏覽器給的
· 瀏覽器不允許我們向別人傳送請求,只能向自己的伺服器傳送請求
· 當我們想向別人的伺服器傳送請求的時候,就會被瀏覽器阻止了
· 什麼是 “別人的伺服器” 呢?
· 當 請求協議/域名/埠號 有任意一個不同的時候,那麼就算是別人的伺服器
· 這個時候就會觸發同源策略
· 我們管觸發了 同源策略 的請求叫做跨域請求
實現一個跨域請求
· 有的時候我們是需要實現跨域請求的
· 我們需要多個伺服器給一個頁面提供資料
· 那麼這個時候我們就要想辦法解決跨域問題
JSONP
· jsonp 是我們實現跨域請求的手段,是把我們之前的東西組合在一起使用的技術手段而已
· 利用的是 script 標籤來實現
script 標籤的本質
· 瀏覽器給我們提供了一個 script 標籤
· 它的本質就是請求一個外部資源,是不受到同源策略的影響的
· 同時 script 標籤的 src 屬性,也是一種請求,也能被伺服器接收到
· 並且:
· script標籤的src屬性請求回來的東西是一個字串,瀏覽器會把這個字串當作 js 程式碼來執行
· 所以我們就可以利用這個 script 標籤的 src 屬性來進行跨域請求了
配置代理(瞭解)
· 代理,分成兩種,正向代理和反向代理
正向代理
· 有一個客戶端需要向一個非同源的伺服器B傳送請求
· 我們搭建一個和客戶端同源的伺服器A
· 當客戶端傳送請求的時候,由伺服器A來接受
· 再由伺服器A向伺服器B傳送請求,因為 同源策略是由瀏覽器給的 ,伺服器之間沒有
· 伺服器B接受到請求以後,會處理請求,並把響應返回給伺服器A
· 再由伺服器A把響應給到客戶端就可以了
· 我們就可以用這個方式來進行跨域請求了
反向代理
· 反向代理一般是用來做負載均衡的
· 當我請求一個伺服器的時候,其實請求的是伺服器端設定的代理伺服器
· 由代理伺服器把若干大量的請求分發給不同的伺服器進行處理
· 再由伺服器把響應給到代理伺服器
· 代理伺服器返回給客戶端
封裝 AJAX
· ajax 使用起來太麻煩,因為每次都要寫很多的程式碼
· 那麼我們就封裝一個 ajax 方法來讓我們使用起來簡單一些
確定一下使用的方式
·
因為有一些內容可以不傳遞,我們可以使用預設值,所以選擇物件傳遞引數的方式
// 使用的時候直接呼叫,傳遞一個物件就可以
ajax({
url: '', // 請求的地址
type: '', // 請求方式
async: '', // 是否非同步
data: '', // 攜帶的引數
dataType: '', // 要不要執行 json.parse
success: function () {} // 成功以後執行的函式
})
· 確定好使用方式以後,就開始書寫封裝函式
封裝
function ajax(options) {
// 先準備一個預設值 var defInfo = {
url : '' , // 地址不需要預設值 type : 'GET' , // 請求方式的預設值是 GET async: false , // 預設值是非同步 data : '' , // 引數沒有預設值 dataType : 'string' , // 預設不需要執行 json.parse success () {}, // 預設是一個函式 }
// 先來判斷一下有沒有傳遞 url,如果沒有,直接丟擲異常 if ( ! options.url) {
throw new Error ( 'url 必須傳遞' )
}
// 有了 url 以後就,我們就把使用者傳遞的引數和我們的預設資料合併 for ( let key in options) {
defInfo[key] = options[key]
}
// 接下來的一切我們都是使用我們的 defInfo 就可以了 // 第一步就是判斷引數 data // data 可以不傳遞,可以為空 // data 也可以是一個 key=value&key=value 格式的字串 // data 也可以是一個物件 // 否則就丟擲異常 if ( ! ( typeof defInfo.data === 'string' && /^(\w+=\w+&?)*$/ .test(defInfo.data) || Object .prototype.toString.call(defInfo.data) === '[object Object]' )) {
throw new Error ( '請按照要求傳遞引數' )
}
// 引數處理完畢以後,在判斷 async 的資料型別 // 只能傳遞 布林資料型別 if ( typeof defInfo. async !== 'boolean' ) {
throw new Error ( 'async 引數只接受布林資料型別' )
}
// 在接下來就判斷 type // 請求方式我們只接受 GET 或著 POST if ( ! (defInfo.type.toUpperCase() === 'GET' || defInfo.type.toUpperCase() === 'POST' )) {
throw new Error ( '目前本外掛只接受 GET 和 POST 方式,請期待更新' )
}
// 接下來就是判斷 success 的判斷,必須是一個函式 if ( Object .prototype.toString.call(defInfo.success) !== '[object Function]' ) {
throw new Error ( 'success 只接受函式資料型別' )
}
// 引數都沒有問題了 // 我們就要把 data 處理一下了 // 因為 data 有可能是物件,當 data 是一個物件的時候,我們要把它轉換成一個字串 var str = ''
if ( Object .prototype.toString.call(defInfo.data) === '[object Object]' ) {
for ( let attr in defInfo.data) {
str += `${ attr }=${ defInfo.data[attr] }&`
}
str = str.slice( 0 , - 1 )
defInfo.data = str
}
// 引數全部驗證過了以後,我們就可以開始進行正常的 ajax 請求了 // 1. 準備一個 ajax 物件 // 因為要處理相容問題,所以我們準備一個函式 function createXHR() {
if (XMLHttpRequest) {
return new XMLHttpRequest()
} else {
return new ActiveXObject( 'Microsoft.XMLHTTP' )
}
}
// 2. 建立一個 ajax 物件 var xhr = createXHR()
// 3. 進行 open xhr.open(defInfo.type, defInfo.url + (defInfo.type.toUpperCase() === 'GET' ? `?${ defInfo.data }&_=${ new Date ().getTime() }` : '' ), defInfo. async )
if (defInfo.type.toUpperCase() === 'POST' ) {
xhr.setRequestHeader( 'content-type' , 'application/x-www-form-urlencoded' )
}
// 4. 進行 send xhr.send((defInfo.type.toUpperCase() === 'POST' ? `${ defInfo.data }` : '' ))
// 5. 接受響應 xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && /2\d{2}/ .test(xhr.status)) {
// 表示成功,我們就要執行 success // 但是要進行 dataType 的判斷 if (defInfo.dataType === 'json' ) {
defInfo.success(JSON.parse(xhr.responseText))
} else {
defInfo.success()
}
}
}}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2690328/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師web前端教程分享前端javascript練習題Ajax封裝程式設計師Web前端JavaScript封裝
- 好程式設計師web前端培訓分享JavaScript學習筆記Promise程式設計師Web前端JavaScript筆記Promise
- 好程式設計師web前端培訓分享JavaScript學習筆記SASS程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記cookie程式設計師Web前端JavaScript筆記Cookie
- 好程式設計師web前端學習路線分享AJAX狀態碼ajax.status及封裝程式設計師Web前端封裝
- 好程式設計師web前端培訓分享學習JavaScript程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript學習筆記之設計模式程式設計師Web前端JavaScript筆記設計模式
- 好程式設計師web前端培訓分享node學習筆記程式設計師Web前端筆記
- 好程式設計師web前端培訓JavaScript學習筆記DOM程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓JavaScript學習筆記--jQuery程式設計師Web前端JavaScript筆記jQuery
- 好程式設計師web前端培訓分享JavaScript學習筆記分支結構程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記之陣列程式設計師Web前端JavaScript筆記陣列
- 好程式設計師web前端培訓分享JavaScript學習筆記之正則程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習指南程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享HTMLCSS學習筆記BFC程式設計師Web前端HTMLCSS筆記
- 好程式設計師web前端培訓分享React學習筆記(一)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享React學習筆記(二)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享React學習筆記(三)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記函式進階程式設計師Web前端JavaScript筆記函式
- 好程式設計師web前端培訓分享JavaScript學習筆記之ES5程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記之迴圈結構程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記閉包與繼承程式設計師Web前端JavaScript筆記繼承
- 好程式設計師web前端培訓分享JavaScript學習筆陣列的排序程式設計師Web前端JavaScript陣列排序
- 好程式設計師web前端培訓分享詳解JavaScript學習筆記建構函式程式設計師Web前端JavaScript筆記函式
- 好程式設計師web前端培訓學習筆記Vue學習筆記一程式設計師Web前端筆記Vue
- 好程式設計師web前端培訓學習筆記Vue學習筆記之二程式設計師Web前端筆記Vue
- 好程式設計師web前端培訓分享JavaScript框架J程式設計師Web前端JavaScript框架
- 好程式設計師web前端培訓分享node學習筆記系列之四十一程式設計師Web前端筆記
- 好程式設計師web前端培訓分享之HTMLCSS學習筆記css3-多列程式設計師Web前端HTMLCSS筆記S3
- 好程式設計師web前端培訓分享HTMLCSS學習筆記css3選擇器程式設計師Web前端HTMLCSS筆記S3
- 好程式設計師web前端培訓分享怎樣學好css?程式設計師Web前端CSS
- 好程式設計師web前端培訓分享九個JavaScript小技巧程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript基礎語法程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript相關知識程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享Javascript中原型屬性程式設計師Web前端JavaScript原型
- 好程式設計師web前端學習路線分享瞭解AJAX是什麼程式設計師Web前端
- 好程式設計師web前端培訓分享之HTMLCSS學習筆記媒體查詢+ rem用法程式設計師Web前端HTMLCSS筆記REM
- 好程式設計師web前端培訓分享HTMLCSS學習之CSS基礎程式設計師Web前端HTMLCSS