亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

為啥跨域要用jsonp,jsonp是不是一種協(xié)議,和json什么關(guān)系?
高洛峰
高洛峰 2016-11-10 10:29:47
0
4
923

js跨域請求不同域名下的數(shù)據(jù),如果是放在script標簽中,直接用src屬性就可以了,為什么還要用jsonp跨域。這種跨域請求主要有哪些作用?

高洛峰
高洛峰

擁有18年軟件開發(fā)和IT教學經(jīng)驗。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項目經(jīng)理、高級軟件工程師等職務。 網(wǎng)絡人氣名人講師,...

全部回覆(4)
學霸

都傳送,我來簡單說一下原理吧

論據(jù):

jsonp和ajax沒半毛錢關(guān)系

jsonp和json也沒半毛錢關(guān)系

證明:

script:src 是不會跨域的,這是主要論據(jù)

這個1.js的內(nèi)容為:

var RESULT = {"data": .....};

這樣加載之后,大家都可以獲得RESULT這個變量,這個很容易理解。

那jQuery的ajax是如何請求并加載這個頁面呢?

$.getScript('http://.../1.js',?function(){
????console.log(RESULT.data);
});
或
$.ajax({
????url:?'http://.../1.js',
????dataType:?'script',
????success:?function(){
????????console.log(RESULT.data);
????}
}

看起來是用ajax請求的,其實是jQuery做了一個模擬,真實代碼更像:

var?s?=?document.createElement('script');
s.src?=?'http://.../1.js';
s.onload?=?function(){
????通知jQuery.ajax,我已經(jīng)加載完畢了
}

為什么會誕生jsonp?

因為在當年,IE 6風行的時候,getScript(或ajax{dataType:'script'},下同),請求jpg/js/css資源是同步的,也就是請求到一個之后,才會請求下一個,而當年網(wǎng)絡上的ajax控件也大部分是做的同步。

為了異步請求,Chrome誕生了。

但是異步會到導致一個問題:因為網(wǎng)絡的原因,我根本不知道RESULT變量是誰傳回來的,并且RESULT會被后請求到的數(shù)據(jù)覆蓋。

所以聰明的前端工程師想到

calljQueryWhoAmI({"data":?....});

這個calljQueryWhoAmI是不停變化的

jsonp流程用戶發(fā)起jsonp請求

$.ajax({
????url:'http://.../1.php?callback=?',
????dataType:?'jsonp',
});

jquery開始做如下工作

//生成一個callback的隨機名字
var?callback?=?'callback_123456789';
//替換用戶的網(wǎng)址為?
http://.../1.php?callback=callback_123456789
//新建一個函數(shù)來接受數(shù)據(jù)
var?callback_123456789?=?function(json)?{
????call?success(json)
}
//開始使用```createElement('script').src="http://.../1.php?callback=callback_12345789"```請求

用戶收到http://.../1.php?callback=callback_123456789做的工作

也就是得到了

callback_12345789({"data":?...})

當這個加載完畢時,系統(tǒng)會自動去

call?callback_12345789

流程繼續(xù)到jQuery的

var?callback_123456789?=?function(json)

你接受到數(shù)據(jù),開始工作


三叔

如果你請求出去,然后需要處理請求返回的結(jié)果,這個時候jsonp的用處就出來了,一個回調(diào)函數(shù),里面有你需要處理的數(shù)據(jù)。

學霸

這篇文章講的挺好的其實:看完就大概懂了,在這里推薦下。? ? ? ? ? ? ? ? ? ?

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html


三叔

因為根據(jù)瀏覽器同源策略,a 域的js不能直接訪問 b域名的信息,但是script 標簽的src屬性可以跨域引用文件,jsonp是請求之后后臺包裝好一段json,并且把數(shù)據(jù)放在一個callback函數(shù),返回一個js文件,動態(tài)引入這個文件,下載完成js之后,會去調(diào)用這個callback,通過這樣訪問數(shù)據(jù)。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板