成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

AJAX的學(xué)習(xí)筆記

RobinTang / 1087人閱讀

摘要:的學(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。

XMLHttpRequest

AJAX的核心是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

相關(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í)筆記來記錄一下。今天先簡單寫一下原理和過程。歡迎大家一起探...

    Forest10 評(píng)論0 收藏0
  • 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í)筆記來記錄一下。今天先簡單寫一下原理和過程。歡迎大家一起探...

    wing324 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記之Demo2——用Ajax來做個(gè)ToDoList(待更新)

    摘要:抱歉,最近忙,本篇等有時(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...

    luck 評(píng)論0 收藏0
  • 網(wǎng)易微專業(yè)之《前端開發(fā)工程師》學(xué)習(xí)筆記(1)

    摘要:點(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)...

    geekzhou 評(píng)論0 收藏0
  • 網(wǎng)易微專業(yè)之《前端開發(fā)工程師》學(xué)習(xí)筆記(1)

    摘要:點(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)...

    劉東 評(píng)論0 收藏0
  • ajax學(xué)習(xí)筆記

    摘要:對(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...

    LeviDing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<