摘要:的學習筆記是異步和的縮寫,它的作用是執行異步的網絡請求。這就是一個格式的,向這個地址請求,將得到一個回調函數,執行就得到數據。
AJAX的學習筆記
AJAX是異步JavaScript和XML的縮寫,它的作用是執行異步的網絡請求。因為JS是線性同步,如果需要用戶向瀏覽器發送一個請求,那么就需要等瀏覽器接收到了結果才能繼續運行,如果發送到接受的時間太長,瀏覽器就會很長時間處于“假死”狀態,這樣的用戶體驗很不好。于是Jesse James Garrett介紹了一種新技術,即用JS執行異步網絡請求,也就是AJAX。
XMLHttpRequestAJAX的核心是XMLHttpRequest(簡稱XHR)對象。
通過一個XMR對象的構造函數,我們可以在JS上開始寫AJAX。
判斷瀏覽器一般我們用var xhr=new XMLHttpRequest()來創建新的XHR對象,但是由于早期的IE版本并不支持原生的XHR,而是支持ActiveXObject,所以開始之前我們需要做一個判斷:
var xhr; if(window.XMLHttpRequest){ xhr=new XMLHttpRequest(); }else{ xhr=new ActiveXObject("Microsoft.XMLHttp"); }設置onreadystatechange回調函數
設置回調函數的目的是,判斷我們發送的請求是否成功,不管成功與否都給出一個回調響應,以讓我們開始下一步的操作。如下:
var xhr; if(window.XMLHttpRequest){ xhr=new XMLHttpRequest(); }else{ xhr=new ActiveXObject("Microsoft.XMLHttp"); } xhr.onreadychange=function(){ //狀態發生變化時,函數回調 if(xhr.readyState===4){ //成功完成 //判斷響應結果: if(xhr.status===200){ //成功,通過responseText拿到響應文本: return success(xhr.responseText); }else{ //失敗,根據響應碼判斷失敗原因: return fail(xhr.status); } }else{ //響應還在繼續。 } }XHR的用法
成功創建XHR對象后,第一個要用的方法就是open(),open()方法傳遞三個參數:
請求的類型;
請求的地址;
是否異步發送請求,默認為true,一般不用填。
例子:
open("get","example.php")
open()方法并不是真正的發送請求,要發送請求還需要用到另一個方法send()。get方式的請求不需要數據,則直接send()就好了,而post則需要把數據以字符串或者formData對象傳進去。
安全限制由于瀏覽器的同源政策,如果你請求的地址URL的域名和你當前的頁面不一致,瀏覽器是不允許的。
所謂的一致,是指完全的一致。
www.xxx.com 和 xxx.com 是不一致的;
www.xxx.com 和www.xxx.com:80 是不一致的;
www.xxx.com:80 和www.xxx.com:8080是不一致的;
https://www.xxx.com 和http://www.xxx.com 也是不一致的。
但是很多時候我們需要從其他的網站調數據,那么怎么來解決它呢?所以我們需要用到跨域技術。
常用的技術有三種。
通過Flash插件發送HTTP請求;
通過在同源域名下架設代理服務器,JS把請求發送到代理服務器上;缺點是要在后端做多余的開發;
JSONP。
JSONP這里重點介紹一下JSONP(JSON with padding,參數式JSON)。由于瀏覽器允許跨域引用JS資源,因此JSONP的原理就是通過觸發在頁面中的JS資源來引用數據。因為JSONP一般是由兩部分組成:回調函數、數據,所以我們只要有一個JSONP格式的URL,并在頁面中準備好兩段代碼:一段是觸發JSONP中回調函數的代碼,這段代碼是用來渲染數據的;另一段是動態生成引用JSONP的。
舉個例子:
我們借用一個根據IP地址查詢天氣的API:http://freegeoip.net/json?cal...。
這就是一個JSONP格式的URL,向這個地址請求,將得到一個handleResponse()回調函數,執行就得到數據。因此我們就可以拿出我們準備好的兩段代碼了。
第一段:
function handleResponse(response){ console.log("you are " + response.ip + ",which is in " + response.city + response.region_name); }
這一段代碼是通過回調函數,把數據渲染出來。
第二段:
function getLocation(){ var script=document.createElement("script"), script.src="http://freegeoip.net/json?callback=handleResponse" document.body.insertBefore(script,document.body.firstChild); }
最后我們只要執行這個getLocation的函數,就完成了跨域調取數據。
CORS我們在上面說到,瀏覽器的同源策略,會阻止接收跨域的請求結果,解決的方法已經在上面簡單介紹了,此外,現在大部分瀏覽器已經能夠支持CORS了。
CORS(Cross-Origin Resource Sharing,跨域資源共享),這是一種規范,允許Web應用服務器進行跨域訪問控制,從而使跨域數據傳輸安全進行。
目前所有的瀏覽器都支持了這個策略,但是,我們的IE10以下的并不在其中……
CORS的原理是使用HTTP頭部信息,讓服務器端與客戶端相溝通,以決定請求或響應是否成功。用一個簡單但是不太恰當的比喻就是,CORS就是你(客戶端)拿著一個口令(頭信息)去通過某個關卡,而這個關卡也有口令,如果你的口令和關卡的口令匹配(相同或者為*),那么你就可以自由出入(跨域請求通過),如果不匹配,你就會被扣留(跨域請求失敗)。
因此,在CORS中,關鍵的是服務端的口令(頭信息)。只要服務端實現了CORS接口,就可以跨域通信。而在客戶端中,只要在open()方法的URL中使用絕對定位即可實現CORS,而CORS通信過程,都是由瀏覽器完成,不需要用戶處理,那么,瀏覽器是怎么處理的呢?
兩種請求瀏覽器把跨域請求分為兩類:簡單請求和預先請求。
簡單請求需要滿足下列兩個條件:
請求方法是下列之一:
GET
HEAD
POST
請求頭中的Content—Type請求頭的值是下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
反之,不滿足其中之一則是預先請求。瀏覽器會先發送一個OPTION請求,用來與域名服務器協商是否可以發送實際的跨域請求。
兩種請求的具體流程過多,這里我就不細說了,有興趣的小伙伴可以從下面幾篇文章中更詳細地了解CORS:
廖雪峰的AJAX教程
阿里云:CORS——跨域請求那些事兒
跨域資源共享 CORS 詳解 - 阮一峰的網絡日志
HTTP訪問控制(CORS) - HTTP | MDN
總之我們只要明白,CORS是一種跨域策略。瀏覽器會在我們需要跨域操作時自定義頭部信息,與服務端進行匹配,以確定是否同意跨域。而頭信息的處理,一般情況下,是由瀏覽器自動完成,不需要開發者處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92810.html
摘要:抱歉,最近忙,本篇等有時間更新。引言本文基于框架做的一個生成和存儲,主要目的是學習使用框架。書籍基于的,學習時使用框架開發。開發環境備注一直想把這本書的個作為系列分享出來,供初學者學習玩玩。 抱歉,最近忙,本篇等有時間更新。 引言 本文基于Laravel框架做的一個URL生成和存儲demo,主要目的是學習使用Laravel框架。內容基于英文書籍《Packt.Laravel.Applic...
摘要:點擊此處了解網易微專業課程前段時間報名參加了網易云課堂微專業課程前端開發工程師,這周課程開始了,正式學習。以下內容為前端開發工程師微專業的第一門課網頁制作的課程學習指南,學習視頻課程后自己整理的學習筆記,會持續更新內容。 何為網易微專業? 微專業是由網易云課堂聯合各領域知名專家,以就業為導向,精心打造的職業培訓方案。按要求完成學習,考試通過可獲得專業認定證書,令你求職或加薪多一份獨特優...
摘要:點擊此處了解網易微專業課程前段時間報名參加了網易云課堂微專業課程前端開發工程師,這周課程開始了,正式學習。以下內容為前端開發工程師微專業的第一門課網頁制作的課程學習指南,學習視頻課程后自己整理的學習筆記,會持續更新內容。 何為網易微專業? 微專業是由網易云課堂聯合各領域知名專家,以就業為導向,精心打造的職業培訓方案。按要求完成學習,考試通過可獲得專業認定證書,令你求職或加薪多一份獨特優...
閱讀 3187·2021-11-23 09:51
閱讀 1524·2021-11-22 09:34
閱讀 2836·2021-10-27 14:15
閱讀 2265·2021-10-12 10:17
閱讀 1883·2021-10-12 10:12
閱讀 946·2021-09-27 14:00
閱讀 1996·2021-09-22 15:19
閱讀 1032·2019-08-30 10:51