JSONP

在一個head標(biāo)簽中我們可以這么寫

<script>
var callback = function(data){
      console.log(data);
  }
callback({name:'王柯智',age:'18'})
// 在控制臺打印出 {name:'王柯智',age:'18'}
</script>

我們定義了一個函數(shù)祈噪,然后我們又調(diào)用了這個函數(shù)糙俗,接下來我們把調(diào)用函數(shù)這句話(callback({name:'王柯智',age:'18'}))放在同級目錄下的另外一個JS文件叫做jsonp.js文件中,接下來我們的head標(biāo)簽就可以這么寫

<script>
var callback = function(data){
      console.log(data);
  }
</script>
<script src='./jsop.js'>
</script>

以上代碼跟第一次我們寫的代碼效果一模一樣。但是我們是從引入外部的JS來調(diào)用我們自己定義的函數(shù)酝锅。
如果把這個外部js放在服務(wù)器上的話,我們的script標(biāo)簽可以會變成這種形式:

<script src='http://xxx.com/jsonp.js'>
</script>

然后我們在服務(wù)器的jsonp.js文件里可以把服務(wù)器的數(shù)據(jù)拿到JS當(dāng)中奢方,也就是說這里的JS是這么寫的

callback({key1:'value',key2:'value2'})

由于我們可能會多次調(diào)用callback函數(shù)搔扁,為了把每次調(diào)用的函數(shù)和函數(shù)調(diào)用后得到的結(jié)果對應(yīng)起來,通常我們會為這個函數(shù)取一個隨機的名字袱巨,代碼實現(xiàn)如下:

var num = Math.floor(Math.random() * 100000) // num是一個1到10萬隨機數(shù) 
window.callbackName = 'callback_' + num;  //給windou添加一個全局屬性callbackName
window[callbackName] = function(data){ 
    console.log(data);
  }

此時我們定義便有了一個callback便有了一個隨機的名字阁谆,但是問題來了,由于我們定義的函數(shù)名是隨機的愉老,我們自己都不知道如何調(diào)用场绿,我們怎么使服務(wù)器上的那個函數(shù)名變成我們的函數(shù)名呢?
JSONP給出了一個方法嫉入,即在你需要加載的js文件后面加上'焰盗?callback="你的函數(shù)名"',所以我們的script標(biāo)簽便需要這樣寫:

<script src='http://xxx.com/jsopn.js?callback='+callbackName>

這樣我們就能把服務(wù)器上的函數(shù)名callback改成我們這里定義的函數(shù)名了咒林。

可是還有個問題熬拒,我們使用了2個script標(biāo)簽,一般來說垫竞,第二個script我們需要他動態(tài)加載澎粟,所以我們只需要使用一個scirpt標(biāo)簽:

<script>

var num = Math.floor(Math.random() * 100000) // num是一個1到10萬隨機數(shù) 
window.callbackName = 'callback_' + num;  //給windou添加一個全局屬性callbackName
window[callbackName] = function(data){ 
    console.log(data);
  }
//定義我們自己的函數(shù),并給他賦予一個隨機的名字
var sc = document.create('script')
sc.src = 'http://xxx.com/jsopn.js?callback=' + callbackName;
sc.id = 'script_' + callbackName;
document.body.appendChild(sc);
// script標(biāo)簽只有添加到文檔當(dāng)中才會去請求資源欢瞪。
document.getElementById(sc.id).remove();
//當(dāng)函數(shù)被調(diào)用以后得到了服務(wù)器端的數(shù)據(jù)便把script標(biāo)簽從文檔中移除.
</script>
以上便是JSONP的用法活烙。

當(dāng)然,我們可以給callback不同的功能遣鼓,比如上述代碼中我們callback的功能是打印出data啸盏,你也可以再寫一個callback,比如里面的代碼是console.log('xxx')也是可以的骑祟,但是這樣的話你可能會重寫一次上面的代碼回懦,會顯得很麻煩,所以我們把JSONP封裝一下次企,變成下面這個樣子:

function jsonp(url,fn){
    var num = Math.floor(Math.random() * 100000);
    var callbackName = 'callback_' + num;
    window[callbackName] = fn;
    var sc = document.createElement('script');
    sc.src = url + '?callback=' + callbackName;
    sc.id = 'script_' + num;
    document.body.appendChild(sc);
    document.getElementById(sc.id).remove()
}

這樣怯晕,當(dāng)我們想用jsonp的方式獲取數(shù)據(jù)并且對數(shù)據(jù)進行處理的話就可以直接運行
jsonp('http://www.xxx.com/jsop.js',function(data){
console.log(data);
})

當(dāng)然,我們也推薦使用JQuery的封裝好的JSONP語法:

$.ajax({
  url:'http://www.xxx.com/jsonp.js',
  datatype:'jsonp',
  success:function(data){
      console.log(data);
  }
}
)

不過需要注意的是缸棵,雖然JQ這里寫的是$.ajax贫贝,但是JSONP并不是Ajax,這樣寫只是為了方便而把Ajax和JSONP的功能封裝在了一起,你在瀏覽器下打開開發(fā)者工具可以看到j(luò)sop的請求類型不是xhr稚晚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崇堵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子客燕,更是在濱河造成了極大的恐慌鸳劳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也搓,死亡現(xiàn)場離奇詭異赏廓,居然都是意外死亡,警方通過查閱死者的電腦和手機傍妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門幔摸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颤练,你說我怎么就攤上這事既忆。” “怎么了嗦玖?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵患雇,是天一觀的道長。 經(jīng)常有香客問我宇挫,道長苛吱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任器瘪,我火速辦了婚禮翠储,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橡疼。我一直安慰自己援所,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布衰齐。 她就那樣靜靜地躺著,像睡著了一般继阻。 火紅的嫁衣襯著肌膚如雪耻涛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天瘟檩,我揣著相機與錄音抹缕,去河邊找鬼。 笑死墨辛,一個胖子當(dāng)著我的面吹牛卓研,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼奏赘,長吁一口氣:“原來是場噩夢啊……” “哼寥闪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磨淌,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疲憋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梁只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缚柳,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年搪锣,在試婚紗的時候發(fā)現(xiàn)自己被綠了秋忙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡构舟,死狀恐怖灰追,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旁壮,我是刑警寧澤监嗜,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抡谐,受9級特大地震影響裁奇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦撵,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一刽肠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧免胃,春花似錦音五、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扼雏,卻和暖如春坚嗜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诗充。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工苍蔬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝴蜓。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓碟绑,卻偏偏與公主長得像俺猿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子格仲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 前言 說到AJAX就會不可避免的面臨兩個問題押袍,第一個是AJAX以何種格式來交換數(shù)據(jù)?第二個是跨域的需求如何解決抓狭?這...
    蠟筆小噺沒有煩惱閱讀 1,606評論 4 43
  • 本文轉(zhuǎn)自伯病,博客園,昵稱:[隨它去吧]否过,http://www.cnblogs.com/dowinning/archi...
    戰(zhàn)神飄雪閱讀 883評論 0 6
  • 0. 前言 說到AJAX就會不可避免的面臨兩個問題午笛。 AJAX以何種格式來交換數(shù)據(jù)? 第二個是跨域的需求如何解決苗桂?...
    公子七閱讀 23,605評論 7 67
  • 誕生背景: 由于Ajax直接請求普通文件存在跨域無權(quán)訪問的問題药磺,甭管是靜態(tài)頁面、動態(tài)網(wǎng)頁煤伟、web服務(wù)癌佩、wcf、只要...
    FTOLsXD閱讀 1,087評論 0 1
  • 什么是JSONP便锨? 先說說JSONP是怎么產(chǎn)生的: 其實網(wǎng)上關(guān)于JSONP的講解有很多围辙,但卻千篇一律,而且云里霧里...
    wanggs閱讀 410評論 0 2