JavaScript 筆記四:AJAX和跨域

都是本人理解,筆記大致概念,不詳細也并非完全正確,所以僅供參考。

AJAX

一種可以在不重載頁面的情況下,與服務(wù)器更新交換數(shù)據(jù)的技術(shù)。

如何創(chuàng)建

通用對象:XMLHttpRequest
IE5/6對象:ActiveXObject

var ajax = new XMLHttpRequest();
ajax.open('get', 'https://abc.com/get/test');
ajax.send();

基本屬性和方法

ajax.readyState
存有 XMLHttpRequest 的狀態(tài)。從 0 到 4 發(fā)生變化。

  • 0: 請求未初始化
  • 1: 服務(wù)器連接已建立
  • 2: 請求已接收
  • 3: 請求處理中
  • 4: 請求已完成,且響應(yīng)已就緒

ajax.status
參見HTTP碼,大致類別如下:

  • 100+ :已建立連接,繼續(xù)請求
  • 200+ :相關(guān)
  • 300+ :重定向相關(guān)
  • 400+ :資源錯誤相關(guān)
  • 500+ :服務(wù)器錯誤相關(guān)

ajax.setRequestHeader()
向請求添加 HTTP 頭

onreadystatechange 事件
每當 readyState 屬性改變時,就會調(diào)用該函數(shù),總共會被觸發(fā) 4 次,分別是: 0-1、1-2、2-3、3-4,對應(yīng)著 readyState 的每個變化。

基本示例

此處僅做簡單介紹:具體參考此處文檔

var ajax;
if (window.XMLHttpRequest) {
  ajax = new XMLHttpRequest();
} else {
  // IE5、6
  ajax = new ActiveXObject('Microsoft.XMLHTTP');
}
ajax.onreadystatechange = function() {
  if (ajax.readyState == 4 && ajax.status == 200) {
    console.log(ajax.responseText) // 請求結(jié)果
  }
};
ajax.open('get', 'https://abc.com/get/test',false);
ajax.send();

AJAX跨域

形成跨域的主要原因是因為同源策略,在同源策略下,站點與站點值之間需滿足一下條件:

  • 同協(xié)議
  • 同域名
  • 同端口

在同源策略下,非同源站點受以下限制:

  • Cookie、LocalStorage 和 IndexDB 無法讀取
  • DOM 無法獲得
  • AJAX 請求不能發(fā)送

解決跨域的詳細解決方案參照此篇文章,此處僅簡單描述AJAX跨域的三種方案:

  • JSONP
  • WebSocket
  • CORS

JSONP

其本質(zhì)就是在網(wǎng)頁插入script元素向服務(wù)器請求數(shù)據(jù),服務(wù)器收到請求后將數(shù)據(jù)放在一個指定名稱的回調(diào)函數(shù)中,然后JS再執(zhí)行此回調(diào)函數(shù)。

WebSocket

WebSocket是一種通信協(xié)議,使用ws://(非加密)和wss://(加密)作為協(xié)議前綴。該協(xié)議不實行同源政策,在請求時請求頭會有Origin字段,而服務(wù)器可根據(jù)Origin字段來進行請求源的限制和許可,以此來決定是否返回數(shù)據(jù)。

CORS

通常情況下,WebSocket是用作其他的業(yè)務(wù)功能,而非解決AJAX跨域的方案,使用CORS才是解決AJAX跨域的首選方案,以下詳細說明。


CORS

詳細文檔

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。
CORS需要瀏覽器和服務(wù)器同時支持。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。

CORS存在兩種請求類型:

  • 基本請求
  • 非簡單請求

只要同時滿足以下兩大條件,就屬于簡單請求。

  • 請求方法是以下三種方法之一:HEAD、GET、POST
  • HTTP的頭信息不超出以下幾種字段:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三個值application/x-www-form-urlencoded、 multipart/form-data、text/plain

簡單請求
如WebSocket,在請求時請求頭會有Origin字段,服務(wù)器可根據(jù)Origin字段來進行請求源的限制和許可,以此來決定是否返回數(shù)據(jù)。

非簡單請求
請求前發(fā)出預檢請求OPTIONS,此請求標識 Origin 會請求哪些 methods ,若同意后,則發(fā)出跨域請求。

與JSONP的比較

CORS與JSONP的使用目的相同,但是比JSONP更強大。
JSONP只支持GET請求,CORS支持所有類型的HTTP請求。
JSONP的優(yōu)勢在于支持老式瀏覽器,以及可以向不支持CORS的網(wǎng)站請求數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實...
    Yaoxue9閱讀 1,414評論 0 6
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實...
    HeroXin閱讀 965評論 0 4
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實...
    他方l閱讀 1,143評論 0 2
  • 簡介 由于受瀏覽器的同源策略(same-origin policy)的影響, Ajax 請求默認只能在同一域名下進...
    叫我峰兄閱讀 518評論 0 2
  • ??2005 年,Jesse James Garrett 發(fā)表了一篇在線文章,題為“Ajax: A new App...
    霜天曉閱讀 945評論 0 1

友情鏈接更多精彩內(nèi)容