聊聊可跨域的jsonp的原理

1.關(guān)于跨域

如果兩個(gè)頁面的協(xié)議呕童,端口(如果有指定)和域名都相同,則兩個(gè)頁面具有相同的源夺饲。同一個(gè)頁面訪問不同的源就是跨域。
下面相對(duì)于https://www.cendeal.cn/jluzh/schedule同源檢測(cè)的例例子:

成功
https://www.cendeal.cn/jluzh/me
成功
https://www.cendeal.cn/jx_meeting
失敗,不同協(xié)議 (https和http)
http://www.cendeal.cn/jluzh/schedule
失敗,不同端口(8080和80)
https://www.cendeal.cn:8080/jluzh/schedule
失敗,不同域名 ( news和store )
https://gz.cendeal.cn/jluzh/schedule

2.頁面內(nèi)可跨域的資源

像script往声,link,img,iframe等標(biāo)簽的資源是可以跨域的浩销。我們打開一個(gè)頁面加載js,css,圖片等資源都是可以從其他源來獲取的。并不要求我們先把資源存到自己的服務(wù)器慢洋,用戶請(qǐng)求頁面,再從我們的服務(wù)器下載陆盘。在這里jsop利用的就是script的js文件可以跨域請(qǐng)求資源的原理。

3.jsonp處理方式

一般服務(wù)器那邊返回的數(shù)據(jù)都是這樣的xxxCallback(json格式的數(shù)據(jù))隘马。比如,淘寶獲取ip的接口:http://www.taobao.com/help/getip.php
返回?cái)?shù)據(jù)

ipCallback({ip:"xx.xx.xx.xx"})

明顯可以看出來祟霍,如果這是一個(gè)js腳本,那么它就是函數(shù)的調(diào)用沸呐,所以在它應(yīng)該是這樣定義的:

function ipCallback(data){
    數(shù)據(jù)處理邏輯代碼
}

4.檢測(cè)一下

準(zhǔn)備一個(gè)test.html文件

<html>
 <head>
  <title>test</title>
 </head>
 <body>
  <script type="text/javascript">
    function ipCallback(data) {
       document.write("we get the data is :"+data['ip'])
    }
  </script>
  <script src="http://www.taobao.com/help/getip.php"></script>
 </body>
</html>

打開頁面你會(huì)看到:


test.html

很明顯我們成功的進(jìn)行了跨域請(qǐng)求。咦崭添,怎么這么簡單的呀!是的,比沒看錯(cuò)是這么簡單的棘伴。但是你會(huì)不會(huì)發(fā)現(xiàn)一個(gè)問題,假如我們想用某個(gè)api時(shí)焊夸,我并不是想像上面那樣,一加載頁面就獲取數(shù)據(jù)了阱穗,我想讓用戶來確定什么時(shí)候來用。那我們改怎么實(shí)現(xiàn)呢揪阶?

5.改善一下

細(xì)心觀察,之前的頁面是在加載完js就開始調(diào)用函數(shù)了鲁僚。那我們先不加載那個(gè)api返回js不就行了嗎炊苫?對(duì)的冰沙,我們就這樣做就可以了,當(dāng)用戶需要的時(shí)候再去加載js就可以了倦淀。

<html>
 <head>
  <title>test next</title>
 </head>
 <body>
 
  <script type="text/javascript">
   //定義url
    var url = "http://www.taobao.com/help/getip.php"
    //定義返回函數(shù)
    function ipCallback(data) {
       alert("we get the data is :"+data['ip'])
    }
    //定義觸發(fā)函數(shù)
    function getNetIp(){
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = url;
        script.id = 'myjs'
        document.body.appendChild(script);
    }
  </script>
   <button onclick="getNetIp()">test</button>
 </body>
</html>

點(diǎn)擊按鈕你會(huì)看到這樣:


test2.html

是的,你又成功了!數(shù)據(jù)撞叽,你隨時(shí)都可以拿到了,這個(gè)其實(shí)還有問題的愿棋,就是不停的點(diǎn)擊,f12查看html你會(huì)發(fā)現(xiàn)script標(biāo)簽會(huì)越來越多糠雨,雖然它沒有影響頁面,但是這不是我們想看到的甘邀。所以你可以繼續(xù)改善琅攘,如果感興趣松邪,自己封裝一個(gè)jsonp的工具函數(shù)坞琴,哈哈逗抑。

6.拓展

原理理解了還是看看人家封裝好的jsonp吧寒亥,jquery已經(jīng)把它封裝在ajax里面了,感興趣可以去看看:
ajax文檔:http://www.w3school.com.cn/jquery/ajax_ajax.asp
簡單例子

$.ajax({
        url: "http://www.taobao.com/help/getip.php",
        type: "GET",//jsonp只有g(shù)et方法
        dataType: "jsonp", //這里指定是jsonp方式請(qǐng)求數(shù)據(jù)
        success: function (data) {//獲取成功時(shí)調(diào)用
        //處理數(shù)據(jù)邏輯
        }
    });

然后你可以用別人的api寫自己的網(wǎng)頁了溉奕,哈哈。
這里放一個(gè)典型的jsonp格式的QQ音樂巔峰榜

https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_opt.fcg?page=index&format=html&v8debug=1&jsonCallback=jsonCallback

返回?cái)?shù)據(jù)


qq音樂
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末加勤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胸竞,更是在濱河造成了極大的恐慌欺嗤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煎饼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吆玖,警方通過查閱死者的電腦和手機(jī)筒溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門怜奖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翅阵,你說我怎么就攤上這事≈澜常” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵讹语,是天一觀的道長。 經(jīng)常有香客問我顽决,道長短条,這世上最難降的妖魔是什么才菠? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鸠儿,結(jié)果婚禮上厕氨,老公的妹妹穿的比我還像新娘。我一直安慰自己命斧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布国葬。 她就那樣靜靜地躺著,像睡著了一般芹壕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踢涌,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音睁壁,去河邊找鬼。 笑死潘明,一個(gè)胖子當(dāng)著我的面吹牛行剂,可吹牛的內(nèi)容都是我干的钳降。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼遂填,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了城菊?” 一聲冷哼從身側(cè)響起备燃,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤并齐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后客税,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡更耻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秧均。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号涯。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖链快,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眉尸,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布噪猾,位于F島的核電站,受9級(jí)特大地震影響袱蜡,放射性物質(zhì)發(fā)生泄漏丝蹭。R本人自食惡果不足惜戒劫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅细。 院中可真熱鬧淘邻,春花似錦茵典、人聲如沸宾舅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔬蕊,卻和暖如春结澄,著一層夾襖步出監(jiān)牢的瞬間岸夯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工猜扮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旅赢。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓齿桃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親短纵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348