細(xì)說JSONP與Ajax的區(qū)別

jsonp與ajax是兩種截然不同的請(qǐng)求方式洽胶,了解它們的原理塔橡,我們先了解什么是跨域图焰∑羰ⅲ跨域請(qǐng)求顧名思義就是請(qǐng)求超過自身域名空間的資源。舉個(gè)例子技羔,假如a.com的首頁index.html頁面里有一段js:

<script>
// jquery寫法
$.ajax({
 Url: “http://b.com/getUserInfo”,
 Method: “post”,
 data: {
   userId: “001”
 },
 success: function(res) {
  console.info(res)
 },
 error: function(e) {
  console.error(e)
 }
})
</script>

當(dāng)你進(jìn)入a.com/index.html驰徊,這段js開始執(zhí)行,結(jié)果是報(bào)錯(cuò)的堕阔,因?yàn)槟惝?dāng)前的域名空間呢是a.com棍厂,而你去請(qǐng)求b.com的用戶數(shù)據(jù),跨域了超陆,瀏覽器由于安全限制是不允許js去請(qǐng)求跨域的數(shù)據(jù)(要是運(yùn)行牺弹,那銀行卡的用戶數(shù)據(jù)不就也可以請(qǐng)求了)浦马。
但是其實(shí)很多時(shí)候,我們需要跨域請(qǐng)求张漂,有兩種方式晶默,1種是代理(下次介紹node做獲取音樂數(shù)據(jù)),另外一種是用jsonp航攒。細(xì)心的程序員發(fā)現(xiàn)<script> <img><a>這一類的節(jié)點(diǎn)的src屬性不受域名限制磺陡,還是那個(gè)例子:

<html>
<head>
  <script src=”http://b.com/getUserInfo”><!--改成用script標(biāo)簽請(qǐng)求剛才的接口-->
</head>
<body><body>
</html>

script標(biāo)簽可以請(qǐng)求到的getUserInfo接口返回的文本數(shù)據(jù),其實(shí)就是跟你引入jquery用了官網(wǎng)提供的cdn鏈接是一樣的
利用這個(gè)方式漠畜,我們可以這么寫:
a域名下的 index.html:

<script  src =” b.com/getUserInfo?calk_back=’printer’ ”>
<script>
var printer= function(data) {
     console.info(data)
}
</script>

b.com 域名下的getUserInfo接口返回文本:
printer("我是data")

上面一訪問 a.com/index.html,結(jié)果控制臺(tái)就會(huì)打印: 我是data

calk_back 參數(shù)名是前后端約定好的币他,后端根據(jù)這個(gè)參數(shù)的值printer,返回 printer(data)憔狞,這樣就把data傳入到 printer函數(shù)中

// 所以
<script src =” b.com/getData?call_back=printer”>


// 等于下面
<script>
printer(‘哈哈哈’)蝴悉; // data 是哈哈哈
</script>

而Ajax的底層是用XmlHttprequest類來實(shí)現(xiàn)異步請(qǐng)求(不刷新頁面就可以獲得響應(yīng)數(shù)據(jù)),所以不能跨域瘾敢,其原理為:

var  request  = new XmlHttprequest()
request.open(‘GET’, url, false)  //fasle 說明這個(gè)是個(gè)異步請(qǐng)求 
//下面指定回調(diào)函數(shù)
request.onreadystatechange = function(success_cb, error_cb){  
// cb只是jquery指定進(jìn)來的
 if ( request.readyState == 4 && request.status == 200 ) {
  success_cb( xhr.responseText );
 } else {
  error_cb( xhr.statusText );
 }
}

jQuery就是幫我們封裝成 $.ajax的工具來使用拍冠,各大瀏覽器為了安全,限制js跨域簇抵,所以ajax是不可以跨域的庆杜。Ajax由于太好用,已經(jīng)成為業(yè)界的標(biāo)準(zhǔn)碟摆,由H5出來后欣福,w3c也為此對(duì)Xmlhttprequest 提出出標(biāo)準(zhǔn)化,對(duì)xmlhttprequest增加新特性

  • 可以設(shè)置HTTP請(qǐng)求的時(shí)限。
  • 可以使用FormData對(duì)象管理表單數(shù)據(jù)(H5 formdata)焦履。
  • 可以上傳文件。
  • 可以請(qǐng)求不同域名下的數(shù)據(jù)(跨域請(qǐng)求雏逾,需要瀏覽器同意)嘉裤。
  • 可以獲取服務(wù)器端的二進(jìn)制數(shù)據(jù)。
  • 可以獲得數(shù)據(jù)傳輸?shù)倪M(jìn)度信息栖博。
    大家可以看一下阮一峰大神的介紹: http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html

現(xiàn)在屑宠,我們直接來封裝一個(gè)工具myRequest,能夠提供 jsonp與ajax兩種請(qǐng)求方式的工具
大家直接看代碼吧(圖片比代碼塊直觀哈):


image.png

提供get仇让、post兩個(gè)方法


image.png

起一個(gè)node 服務(wù):

image.png

訪問http://localhost:3000/, 返回index.html
image.png

當(dāng)他去請(qǐng)求百度的東西典奉,就跨域了
image.png

再來看看jsonp方法


image.png

我們拿QQ的接口來對(duì)看jsonp方法的執(zhí)行結(jié)果:


image.png

結(jié)果:jsonp獲取到數(shù)據(jù)
image.png

下一篇:《Ajax 文件上傳下載》
備注:等寫好把代碼鏈接貼出來

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丧叽,一起剝皮案震驚了整個(gè)濱河市卫玖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踊淳,老刑警劉巖假瞬,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陕靠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脱茉,警方通過查閱死者的電腦和手機(jī)剪芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琴许,“玉大人税肪,你說我怎么就攤上這事“裉铮” “怎么了益兄?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)串慰。 經(jīng)常有香客問我偏塞,道長(zhǎng),這世上最難降的妖魔是什么邦鲫? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任灸叼,我火速辦了婚禮,結(jié)果婚禮上庆捺,老公的妹妹穿的比我還像新娘古今。我一直安慰自己,他們只是感情好滔以,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布捉腥。 她就那樣靜靜地躺著,像睡著了一般你画。 火紅的嫁衣襯著肌膚如雪抵碟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天坏匪,我揣著相機(jī)與錄音拟逮,去河邊找鬼。 笑死适滓,一個(gè)胖子當(dāng)著我的面吹牛敦迄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凭迹,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罚屋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嗅绸?” 一聲冷哼從身側(cè)響起脾猛,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鱼鸠,沒想到半個(gè)月后尖滚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉刘,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年漆弄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睦裳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撼唾,死狀恐怖廉邑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倒谷,我是刑警寧澤蛛蒙,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站渤愁,受9級(jí)特大地震影響牵祟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抖格,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一诺苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雹拄,春花似錦收奔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至势篡,卻和暖如春翩肌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禁悠。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工念祭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绷蹲。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顾孽,于是被迫代替她去往敵國和親祝钢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,196評(píng)論 0 7
  • 第一章 入門 基本功能:訪問和操作 dom 元素若厚,控制頁面樣式拦英,對(duì)頁面的事件處理,與ajax完美結(jié)合测秸,有豐富的插件...
    X_Arts閱讀 1,045評(píng)論 0 2
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)疤估。在JavaScript中灾常,有一個(gè)很重要的...
    西瓜w閱讀 1,763評(píng)論 0 1
  • 張愛玲遇到胡蘭成后钞瀑,說到:“見了他,她變得很低很低慷荔,低到塵埃里雕什,但她心里是歡喜的,從塵埃里開出花來显晶〈叮” 能讓張這樣...
    樓蘭樓蘭閱讀 169評(píng)論 0 0
  • ——給將要結(jié)婚的老公的信 豬嘿嘿: 中午睡太多,晚上也是習(xí)慣性的思想活躍磷雇。為什么我會(huì)是今天這樣看著冷淡但...
    晨一一閱讀 256評(píng)論 1 0