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