js跨域請求不同域名下的數(shù)據(jù),如果是放在script標簽中,直接用src屬性就可以了,為什么還要用jsonp跨域。這種跨域請求主要有哪些作用?
擁有18年軟件開發(fā)和IT教學經(jīng)驗。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項目經(jīng)理、高級軟件工程師等職務。 網(wǎng)絡人氣名人講師,...
都傳送,我來簡單說一下原理吧
論據(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ù)。