前端學習(七十九) DOM-Ajax(Dom)
全稱:Asynchronous JavaScript And XML
簡單的說就是利用一系列技術,使用Ajax模型,在不重新整理頁面的基礎上與伺服器進行通訊
Ajax實現
都是通過XHR物件實現的,IED範文中以ActiveXObject實現(不考慮)
XHR
全稱:XMLHttpRequest,雖然叫做這個,但是XHR可以取回所以型別的資源,並不侷限於XML
建立XHR物件
new XMLHttpRequest()建立
屬性
屬性名 | 描述 |
readyState | 請求的狀態 |
onreadystatechange | 當readyState屬性改變時會呼叫 |
response | 相應實體,型別由responseType指定 |
responseType | 指定響應型別 |
status | 請求的響應狀態碼,只讀 |
statusText | 請求的響應狀態資訊,只讀 |
unload | 可以在upload上新增一個事件監聽來跟蹤上傳過程 |
readyState
readyState有不同的值,在不同的值代表不同的狀態
0:尚未傳送
1:請求已經開啟,但是尚未傳送
2:已經開始傳送
3:傳送中
4:傳送結束(另外,注意只有當狀態為4階段的時候,才有resonseText資訊)
responseType
responseType有不同的值,不同的值代表的型別不同
‘’:預設,字串
‘arraybuffer’:arraybuffer型別
'blob':HEADERS_RECEIVED
'document':document
'json':json
'text':字串
XHR方法
主要的方法有三個
open(method,url,async,username,password)
代表初始化請求,開啟請求
- method:傳送的方法,有GET/POST/DELETE/HEAD/OPTIONS/PUT
- url:地址
- async:是否非同步,預設是非同步
- username:使用者名稱
- password:密碼
setRequestHeader(header,value)
設定請求頭資訊
- header:名稱
- value:對應的值
send(data)
傳送請求
- data:String/FormData
示例
var xhr=new XMLHttpRequest(); //建立xhr物件
xhr.onreadystatechange = function(callback) {
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status <300 || xhr.status == 304){
callback(xhr.responseText);
}
else{
console.error('失敗'+xhr.status);
}
}
}
xhr.open('get','example.com',true); //開啟請求
xhr.setRequestHeader('header-key','header-value'); // 設定頭部
xhr.send(null) //傳送請求
首先是建立xhr物件,然後通過監聽readyState,來判斷當前的狀態值的變化,然後通過onreadystatechange判斷,當值變為我們需要的值時,執行一些操作
Ajax跨域
什麼是跨域?
- 違反瀏覽器同源策略的資源訪問行為
什麼是同源?
- 兩個頁面必須使用的是相同的協議,埠,主機,比如都是http(協議),都是80(埠),都是xxx.com(主機也就是域名),換句話說,也就是網址前面的:http://xxx.com:80,這一段必須完全相同,則是同源
我個人的理解就是,訪問不同網址資料夾的資源,比如有兩個網站a.com和b.com,這兩個網站的資源包括圖片,網頁等都儲存在各自的資料夾下,但是如果要a.com訪問b.com資料夾下的內容,就不行,這時就需要用到跨域
為什麼要跨域?
實際上,很多內容都需要跨域,最簡單的不同的應用域名就不同,因此就就無法訪問,所以用到了跨域
跨域的方法
CORS(Cross-Origin Resource Sharing)
iframe代理
- message
- window.name
- document.domain
JSONP
CORS(Cross-Origin Resource Sharing)
是xhr2的新特性,但是xhr1中是禁止跨域請求的,所以存在一定的相容問題
xhr2中,可以傳送跨域請求,由伺服器決定是否允許,瀏覽器不再幹涉
xhr1中,即時伺服器端允許,前端也傳送了請求,但是瀏覽器會禁止傳送
iframe代理
簡單的說,就是在a.com中嵌入了一個b.com的頁面,所有需要訪問b.com的資源頭通過嵌入的代理頁面去請求訪問,這種方式優點很明顯,就是相容各種瀏覽器
JSONP
原理就是<script>這個是可以跨域的,不受同源策略限制,所以可以使用請求一段js程式碼,不過這種方法的限制比較明顯只能使用GET方法,因此實際開發中的使用有一定侷限