Ajax詳解

一臭增、Ajax概述

1、Ajax介紹

(1)AJAX全稱:
Asynchronous: 異步(默認(rèn)true) synchronous(同步false)
Javascript:核心技術(shù)還是js
And:
Xml:主要作為不同開發(fā)語言之間傳輸數(shù)據(jù)的標(biāo)準(zhǔn)(xml各墨、json)
直譯:異步的javascript和xml
簡單的說Ajax就是一門可以與服務(wù)器進(jìn)行異步或者是同步交互的一門技術(shù),可以實(shí)現(xiàn)頁面無刷新與服務(wù)器進(jìn)行數(shù)據(jù)的交互。

簡單說启涯,同步和異步交互就是在于代碼的執(zhí)行順序欲主。
同步代碼按照順序運(yùn)行,異步代碼不按照順序運(yùn)行逝嚎。

舉例說明:以同步或異步的方式去做飯
同步方式:只能等飯煮熟了后扁瓢,再去炒菜或菜熟了再去煮飯。
異步方式:飯正在煮的時(shí)候补君,我們可以去炒菜引几。
顯然,異步方式編程效率更高效挽铁。

同步代碼會(huì)再造成代碼的阻塞伟桅,因?yàn)橥酱a在內(nèi)存棧區(qū)執(zhí)行,嚴(yán)格按照順序來執(zhí)行叽掘。異步代碼是不會(huì)阻塞的楣铁。且只有棧中同步代碼執(zhí)行完畢之后,才執(zhí)行異步的代碼更扁。

2盖腕、Ajax實(shí)際應(yīng)用場景

①無刷新搜索
②無刷新驗(yàn)證郵箱或者手機(jī)號(hào)或者用戶名的唯一性
③無刷新分頁
好處:①減少數(shù)據(jù)庫服務(wù)器的壓力 ②提高用戶體驗(yàn)

二赫冬、Ajax對(duì)象

1、創(chuàng)建ajax對(duì)象
創(chuàng)建Ajax對(duì)象的主要考慮主流的瀏覽器(W3C)還有低版本的IE瀏覽器.

主流W3C標(biāo)準(zhǔn)瀏覽器 (google,firefox,operate,高版本的IE瀏覽器,safari):
var xhr = new XMLHttpRequest(); 重點(diǎn)掌握溃列,注意字母大小寫

低版本的IE瀏覽器(IE6,7,8)(了解即可)
var xhr = new ActiveXObject('Microsoft.XMLHTTP');

更低版本的IE瀏覽器(了解即可)
var xhr = new ActiveXObject("Msxml2.XMLHTTP");

代碼如下:

<title>Document</title>
<script type="text/javascript">
        //主流瀏覽器創(chuàng)建ajax對(duì)象(google劲厌、firefox、高版本IE听隐、safari)
        var xhr = new XMLHttpRequest();
        //低版本IE創(chuàng)建ajax對(duì)象
       //var xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
        console.log(xhr);
</script>

2补鼻、封裝兼容瀏覽器通用的Ajax對(duì)象
a、通過try-catch實(shí)現(xiàn)雅任,代碼如下:

//封裝通用的ajax對(duì)象
function createXhr(){
    var xhr = null;
    try{
        //主流瀏覽器
        xhr = new XMLHttpRequest();
    }catch(e){
        //低版本IE
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    //返回創(chuàng)建好的xhr對(duì)象
    return xhr;
}

b风范、通過把創(chuàng)建ajax對(duì)象的方法名作為window全局對(duì)象的屬性判斷來實(shí)現(xiàn)。
使用的時(shí)候的沪么,直接在html文件引入下面createXhr.js文件硼婿,調(diào)用上面封裝好的方法即可:

function createXhr(){
    var xhr = null;
    //先考慮主流的
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }else{
        alert('請(qǐng)升級(jí)您的瀏覽器,推薦安裝google瀏覽器');
    }
    
    //返回創(chuàng)建好的xhr對(duì)象
    return xhr;
}

三成玫、Ajax入門案例

1加酵、使用Ajax的get請(qǐng)求獲取服務(wù)器響應(yīng)數(shù)據(jù)

Ajax中的get請(qǐng)求的總結(jié)(四步曲)
第一步:創(chuàng)建ajax對(duì)象
第二步:給ajax的請(qǐng)求狀態(tài)改變,綁定監(jiān)聽的事件處理程序哭当,在判斷狀態(tài)等于4且狀態(tài)碼等于200猪腕,接收服務(wù)端響應(yīng)回來的數(shù)據(jù),處理自己的業(yè)務(wù)邏輯
第三步:建立一個(gè)http連接
第四步:發(fā)送http連接

2钦勘、使用Ajax發(fā)送POST請(qǐng)求獲取服務(wù)器響應(yīng)數(shù)據(jù)

Ajax中的post請(qǐng)求的總結(jié)(五步曲)
第1步:創(chuàng)建ajax對(duì)象
第2步:給ajax的請(qǐng)求狀態(tài)改變陋葡,綁定監(jiān)聽的事件處理程序,在判斷狀態(tài)等于4且http狀態(tài)碼等于200彻采,接收服務(wù)端響應(yīng)回來的數(shù)據(jù)腐缤,處理自己的業(yè)務(wù)邏輯
第3步:建立一個(gè)http連接
第4步:設(shè)置post請(qǐng)求頭,模擬post表單來傳遞數(shù)據(jù)給服務(wù)端(否則獲取不到send()中的參數(shù))
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
第5步:發(fā)送http連接

3肛响、get和post請(qǐng)求總結(jié)

get是四步走岭粤,post是五步走。

get:其中有三步一定要按照如下順序:
1特笋、創(chuàng)建ajax對(duì)象 new XMLHttpRequest
2剃浇、創(chuàng)建一個(gè)http請(qǐng)求 open
3、發(fā)送一個(gè)http請(qǐng)求 send

至于xhr.onreadystatechange = function(){}這一步猎物,放在上面三步中的任意一步后面都可以虎囚,因?yàn)槲覀兌伎梢圆东@到狀態(tài)等于4。建議蔫磨,此步放在創(chuàng)建ajax之后淘讥,因?yàn)榭梢员O(jiān)聽更多的狀態(tài)。

post:其中有四步一定要按照如下順序:
1堤如、建ajax對(duì)象 new XMLHttpRequest
2蒲列、創(chuàng)建一個(gè)http請(qǐng)求 open
3窒朋、設(shè)置post請(qǐng)求頭 setRequestHeader
4、發(fā)送一個(gè)http請(qǐng)求 send

至于xhr.onreadystatechange = function(){}這一步嫉嘀,放在上面四步中的任意一步后面都可以炼邀,因?yàn)槲覀兌伎梢圆东@到狀態(tài)等于4魄揉。建議剪侮,此步放在創(chuàng)建ajax之后,因?yàn)榭梢员O(jiān)聽更多的狀態(tài)洛退。

四瓣俯、Ajax異步和同步運(yùn)行的原理

Ajax同步:首先代碼從上到下按照?qǐng)?zhí)行,如果遇到了同步的Ajax代碼段兵怯,只有等同步的Ajax程序執(zhí)行完畢之后彩匕,其后面的代碼才會(huì)執(zhí)行。若Ajax同步的代碼還沒執(zhí)行完畢媒区,其后面的代碼是一直處于阻塞狀態(tài)驼仪。

Ajax異步:首先代碼從上到下依次執(zhí)行,如果是遇到異步的Ajax代碼段袜漩,則瀏覽器會(huì)新開一個(gè)線程去處理異步的Ajax代碼绪爸,對(duì)后面的代碼沒有影響,依然按順序執(zhí)行宙攻,即異步后面的代碼不會(huì)出現(xiàn)阻塞的情況奠货。

特別注意,JavaScript引擎是在棧中單線程執(zhí)行js代碼座掘,異步的ajax代碼是瀏覽器新開啟一個(gè)線程單獨(dú)去執(zhí)行異步代碼的递惋,同步則不會(huì)開啟新線程。(瀏覽器是多線程的)


五溢陪、Ajax跨域

1萍虽、介紹

因?yàn)橛捎跒g覽器的同源(域)策略,禁止ajax從一個(gè)域名請(qǐng)求另外一個(gè)域名上的數(shù)據(jù)

2、如何才算跨域

如一個(gè)普通的url地址如下:

http://www.abc.com:80/index.html

我們可以把上面的url地址分為四個(gè)部分:

協(xié)議:http,https

一級(jí)(頂級(jí))域名:abc.com baidu.com

二級(jí)域名:www.abc.com 形真、 blog.abc.com image.baidu.com

端口號(hào):http協(xié)議默認(rèn)是80端口,https默認(rèn)是443

以上四個(gè)部分,ajax請(qǐng)求的時(shí)候只要有一個(gè)地方不一樣都算做跨域請(qǐng)求杉编。

3、解決跨域的辦法

主要有以下三種解決方法:重點(diǎn)掌握通過php代理的形式完成跨域請(qǐng)求没酣。

由于瀏覽器的同源策略影響王财,ajax只能訪問同域名下的文件,因此要是實(shí)現(xiàn)跨域一般有以下幾種方案:

?第一種:通過php代理去請(qǐng)求裕便。

注:服務(wù)端語言php是沒有跨域限制的绒净。

?第二種:通過CORS方式。

這是html5提供解決跨域限制的一種辦法偿衰。在請(qǐng)求的服務(wù)端頁面中設(shè)置以下響應(yīng)頭即可挂疆,告訴瀏覽器可以跨域請(qǐng)求改览。
header(“Access-Control-Allow-Origin:*”); // *代表允許所有域名訪問
header(“Access-Control-Allow-Origin:http://native.com”)缤言; // 值只允許nativa.com訪問
一般不會(huì)使用CORS方式:IE10以下不支持宝当。


?第三種:通過jsonp實(shí)現(xiàn),實(shí)質(zhì)通過script標(biāo)簽的src屬性完成跨域胆萧。

jsonp只是一個(gè)約定跨域的形式庆揩。 跟json沒有關(guān)系。
jsonp跨域原理:

就是利用<script>標(biāo)簽沒有跨域限制的跌穗,從而達(dá)到與第三方網(wǎng)站通訊的目的订晌。當(dāng)需要通訊時(shí),本站(local.com)通過js創(chuàng)建一個(gè)<script>標(biāo)簽蚌吸,其src屬性值指向第三方網(wǎng)站(native.com)的一個(gè)php文件的地址锈拨。
特別注意:jsonp只針對(duì)get請(qǐng)求。
如:<script src="http://native.com/index.php?callback=fnName"></script>
本站(local.com)設(shè)置好一個(gè)js回調(diào)函數(shù)(fnName)
第三方網(wǎng)站(native.com)輸出一個(gè)js執(zhí)行函數(shù)的形式羹唠,并且傳遞json數(shù)據(jù)作為函數(shù)參數(shù)奕枢。(故稱之為jsonp,即json padding)


注:jsonp只針對(duì)get請(qǐng)求,跟ajax沒有關(guān)系

jsonp跨域代碼如下:

必須有兩個(gè)域名配合使用:

a佩微、先去native.com域名上面建立一個(gè)jsonp.php的接口文件



b缝彬、再去local.com域名建立一個(gè)jsonp.html文件請(qǐng)求jsonp.php文件




問:還有哪些標(biāo)簽可以跨域?

答:img-src喊衫、iframe-src跌造、link-href、script-src

注意:如果是ajax請(qǐng)求族购,其type類型為xhr,是jsonp(js)類型,則type的值script



分析jd商品搜索跨域?yàn)槔?/p>


為什么jd網(wǎng)站會(huì)采用jsonp方式跨域呢壳贪?
答:jd會(huì)把不同的業(yè)務(wù)放在不同的服務(wù)器進(jìn)行處理,這樣可以減輕單臺(tái)服務(wù)器的壓力寝杖。

推薦幾個(gè)常用的Api接口的網(wǎng)站: 聚合api: <u>https://www.juhe.cn/</u> apiStore: <u>http://apistore.baidu.com/</u>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末违施,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瑟幕,更是在濱河造成了極大的恐慌磕蒲,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只盹,死亡現(xiàn)場離奇詭異辣往,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)殖卑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門站削,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孵稽,你說我怎么就攤上這事许起∈迹” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵园细,是天一觀的道長惦积。 經(jīng)常有香客問我,道長猛频,這世上最難降的妖魔是什么狮崩? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮伦乔,結(jié)果婚禮上厉亏,老公的妹妹穿的比我還像新娘董习。我一直安慰自己烈和,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布皿淋。 她就那樣靜靜地躺著招刹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窝趣。 梳的紋絲不亂的頭發(fā)上疯暑,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音哑舒,去河邊找鬼妇拯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洗鸵,可吹牛的內(nèi)容都是我干的越锈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼膘滨,長吁一口氣:“原來是場噩夢啊……” “哼甘凭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起火邓,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤丹弱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铲咨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躲胳,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纤勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坯苹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踊东,死狀恐怖北滥,靈堂內(nèi)的尸體忽然破棺而出刚操,到底是詐尸還是另有隱情,我是刑警寧澤再芋,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布菊霜,位于F島的核電站,受9級(jí)特大地震影響济赎,放射性物質(zhì)發(fā)生泄漏鉴逞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一司训、第九天 我趴在偏房一處隱蔽的房頂上張望构捡。 院中可真熱鬧,春花似錦壳猜、人聲如沸勾徽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喘帚。三九已至,卻和暖如春咒钟,著一層夾襖步出監(jiān)牢的瞬間吹由,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工朱嘴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倾鲫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓萍嬉,卻偏偏與公主長得像乌昔,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帚湘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Ajax的基本概念及使用 同步&異步 同步:必須等待前面的任務(wù)完成玫荣,才能繼續(xù)后面的任務(wù); 異步:不受當(dāng)前主要任務(wù)的...
    magic_pill閱讀 1,939評(píng)論 0 5
  • ??2005 年,Jesse James Garrett 發(fā)表了一篇在線文章资柔,題為“Ajax: A new App...
    霜天曉閱讀 883評(píng)論 0 1
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,173評(píng)論 0 7
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5焙贷? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,424評(píng)論 1 45
  • 1贿堰、XMLHttpRequest 對(duì)象 在瀏覽器中創(chuàng)建XHR 對(duì)象 1.1 XHR 的用法 在使用XHR 對(duì)象時(shí)辙芍,...
    shanruopeng閱讀 580評(píng)論 0 1