亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

2024-09-01 08:33:39
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別 的相關資料,需要的朋友可以參考下
 

前言

  第一次聽說jsonp,其實早在2年之前。當時在做一個活動頁面的抽獎模塊,要從服務端get一個概率,當時什么都不懂,同事說用ajax,我就用ajax,同事說dataType改成jsonp,我就改成jsonp。于是乎活動頁面做完了,以后也沒有碰到過jsonp,在這期間我一直以為jsonp跟ajax息息相關,是xhr的一種特殊的跨域形式...直到一個月前的一次面試,問到jsonp我被虐成狗,才決定看下jsonp,好吧,原來jsonp也不是很難。

為什么要用jsonp?

  相信大家對跨域一定不陌生,對同源策略也同樣熟悉。什么,你沒聽過?沒關系,既然是深入淺出,那就從頭說起。

  假如我寫了個index頁面,頁面里有個請求,請求的是一個json數據(不知道json數據的猛戳JSON簡介以及用法匯總),簡單思考寫下如下代碼:

<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script><script type="text/javascript"> $.ajax({ url: 'http://localhost/a.json', dataType: "json", success: function (data) {  console.log(data); } })</script> { "name": "hanzichi", "age": 10} 

  樓主把兩個文件都放在wamp下的www文件夾下,ajax請求沒有跨域,完美得到結果:

Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

  但是如果我的json文件和index文件不在一個域下,即跨域(不懂跨域的可參考JavaScript 的同源策略)了呢?

  試著在wamp下新開個apache端口(不知道怎么開的可參考WampServer下使用多端口訪問),將json文件放到該服務端口的文件夾下(樓主設置的端口號為8080,默認的是80端口),試著發送請求: 

<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script><script type="text/javascript"> $.ajax({ url: 'http://localhost:8080/a.json', dataType: "json", success: function (data) {  console.log(data); } })</script> 

Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

  很顯然,提示跨域了!怎么搞?這時jsonp就要出馬了!

神奇的script標簽

  與jsonp息息相關的是script標簽,而xhr或者說傳統意義上的ajax與之沒有半毛錢關系!

  接著看上面的index.html代碼,我們看到頁面引用了百度cdn的jquery路徑,對于這樣的方式我們似乎已經習以為常,但是仔細一想,script標簽可是完完全全的跨域的啊...沒錯,jsonp的實現核心就是利用script標簽的跨域能力!于是我們靈機一動,似乎可以這么搞,動態生成一個script標簽,把json的url賦值給script的src屬性,然后再把這個script標簽插入dom里...

<body> <script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script> <script type="text/javascript"> var s = document.createElement('script'); s.src = 'http://localhost:8080/a.json'; document.body.appendChild(s); </script></body> 

  我們創建了一個script標簽,而標簽內包裹的內容正是需要的json數據,但是報錯如下:

 Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

  原因是因為json數據并不是合法的js語句,把上面的json數據放在一個回調函數中是最簡單的方法:

<body> <script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script> <script type="text/javascript"> function jsonpcallback(json) {  console.log(json); } var s = document.createElement('script'); s.src = 'http://localhost:8080/a.json'; document.body.appendChild(s); </script></body> jsonpcallback({ "name": "hanzichi", "age": 10}); 

Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

  當然,這時的a.json文件并不一定要這樣命名,改成a.js也不會有一點問題。

  而如果是與服務端交互也是一樣的道理,比如和php:

<body> <script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script> <script type="text/javascript"> function jsonpcallback(json) {  console.log(json); } var s = document.createElement('script'); s.src="http://localhost:8080/test.php?callback=jsonpcallback"; document.body.appendChild(s); </script></body> <?php $jsondata = '{ "name": "hanzichi", "age": 10 }'; echo $_GET['callback'].'('.$jsondata.')';?> 

  需要注意的是,jsonp提供的url(即動態生成的script標簽的src),無論看上去是什么形式,最終生成返回的都是一段js代碼。

JQuery對jsonp的封裝

  為了便于開發,jq對jsonp也進行了封裝,封裝在了ajax方法中。

<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script><script type="text/javascript"> $.ajax({ url: 'http://localhost:8080/a.json', dataType: 'jsonp', jsonpCallback: 'CallBack', success: function (data) {  console.log(data); } });</script> CallBack({ "name": "hanzichi", "age": 10}); 

  以上代碼是針對請求文件中寫死了callback函數名的情況。因為請求的是json文件,json不是服務器端的動態語言不能進行解析,如果是php或者其他的服務器端語言,則不用寫死函數名,比如下面這樣:

<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script><script type="text/javascript"> $.ajax({ url: 'http://localhost:8080/test.php', dataType: 'jsonp', success: function (data) {  console.log(data); } });</script> <?php $jsondata = '{ "name": "hanzichi", "age": 10 }'; echo $_GET['callback'].'('.$jsondata.')';?> 

   當然類似的封裝好的方法還有幾種:

// 1$.getJSON("http://localhost:8080/test.php?callback=?", function(data) {  console.log(data);});// 2$.get('http://localhost:8080/test.php', function(data) {  console.log(data);}, 'jsonp'); 

  需要注意的是getJSON方法的請求地址url需要帶上callback=?,因為jq對該方法進行封裝的時候并沒有默認回調函數變量名為callback,于是php中$_GET['callback']就找不到變量值了。

  而一般的jq方法url 中不用指定 callback 參數。對于 jQuery 中的 jsonp 來說,callback 參數是自動添加的。默認情況下,jQuery 生成的 jsonp 請求中 callback 參數是形如 callback=jQuery200023559735575690866_1434954892929 這種根據看似隨機的名字,對應的就是 success 那個處理函數,所以一般不用特意處理。二如果要寫死callback名的話,可以參照上文。

 Jsonp 關鍵字詳解及json和jsonp的區別,ajax和jsonp的區別

總結

  由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、端口)的資源,為了實現跨域請求,可以通過script標簽實現跨域請求,然后在服務端輸出JSON數據并執行回調函數,從而解決了跨域的數據請求,這就是jsonp的核心。

  jsonp原理:

 1.首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。
 2.服務器先生成 json 數據。 然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp. 最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
 3.客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)

 json和jsonp的區別,ajax和jsonp的區別

 json和jsonp雖然只有一個字母的區別,但是它們之間扯不上關系。

json是一種輕量級的數據交換格式。

jsonp是一種跨域數據交互協議。

json的優點:(1)基于純文本傳遞極其簡單,(2)輕量級數據格式適合互聯網傳遞,(3)容易編寫和解析。

ajax和jsonp的區別:

相同點:都是請求一個url

不同點:ajax的核心是通過xmlHttpRequest獲取內容

    jsonp的核心則是動態添加<script>標簽來調用服務器 提供的js腳本。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产天堂久久国产91| 久久精品91久久香蕉加勒比| 久久影院资源站| 国产精品福利观看| 欧美亚洲成人精品| 亚洲一区二区三区香蕉| 国产欧美一区二区三区久久人妖| 国产在线视频欧美| 国产亚洲精品久久久久久| 日韩精品免费电影| 欧美在线视频免费观看| 538国产精品一区二区免费视频| 欧美精品激情blacked18| 欧美性色视频在线| 成人免费视频a| 日本人成精品视频在线| 成人激情视频小说免费下载| 久99九色视频在线观看| 成人黄色免费在线观看| 亚洲天堂av在线播放| 91精品国产91久久久久久最新| 国产不卡视频在线| 久热精品视频在线观看| 国产成人福利夜色影视| 欧美国产精品人人做人人爱| 91在线视频九色| 4p变态网欧美系列| 亚洲国产精久久久久久| 日韩欧美aⅴ综合网站发布| 国产成人一区二区三区电影| 亚洲高清在线观看| 成人性生交大片免费观看嘿嘿视频| 久久国产精品久久久| 亚洲欧洲国产精品| 日韩一区在线视频| 成人激情在线观看| 亚洲电影免费观看高清完整版在线| 亚洲v日韩v综合v精品v| 欧美成在线视频| 欧美大片欧美激情性色a∨久久| 久久久久久久97| 日韩欧美亚洲一二三区| 久久久噜噜噜久久中文字免| 久久免费精品日本久久中文字幕| 欧美日韩在线视频一区二区| 欧美孕妇与黑人孕交| 欧美日韩精品在线| 日韩精品免费电影| 亚洲国产精品网站| 蜜臀久久99精品久久久久久宅男| 精品少妇v888av| 国内精品久久久久久久| 亚洲精品黄网在线观看| 国产一区二区美女视频| 免费97视频在线精品国自产拍| 日韩免费观看av| 欧美成人性生活| 88xx成人精品| 成人免费看片视频| 91精品免费久久久久久久久| 国产热re99久久6国产精品| 日韩av网站在线| 欧美高清不卡在线| 欧美另类在线观看| 中文字幕欧美在线| 久久99久国产精品黄毛片入口| 91免费精品国偷自产在线| 成人观看高清在线观看免费| 伊人久久五月天| 国产亚洲精品久久久久久牛牛| www.欧美免费| 亚洲国产毛片完整版| 国产欧美在线视频| 国产日本欧美一区| 中文字幕欧美国内| 国产在线播放91| 久久九九热免费视频| 日韩人体视频一二区| 欧美精品久久久久久久久久| 国产精品久久久久7777婷婷| 亚洲精品丝袜日韩| 亚洲综合av影视| 亚洲欧美在线磁力| 在线观看国产精品91| 久久精品国产69国产精品亚洲| 精品视频—区二区三区免费| 国产欧美精品一区二区三区-老狼| 精品免费在线观看| 国产精品自拍网| 国产精品美女呻吟| 一本久久综合亚洲鲁鲁| 亚洲欧美在线x视频| 中文字幕免费精品一区| 国产日韩欧美自拍| 欧美中文字幕第一页| 亚洲国产精品系列| 97精品一区二区视频在线观看| 精品日本高清在线播放| 午夜精品久久久久久久久久久久| 中文字幕av一区二区三区谷原希美| 日韩有码在线观看| 欧美成人免费播放| 亚洲国产精品成人va在线观看| 综合欧美国产视频二区| www.欧美精品| 久久久久久一区二区三区| 亚洲成在人线av| 91精品国产成人www| 一级做a爰片久久毛片美女图片| 色综合亚洲精品激情狠狠| 91精品国产高清| 欧美精品videos性欧美| 亚洲美女在线视频| 国产丝袜一区视频在线观看| 成人精品网站在线观看| 在线观看视频亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久99精品国产99久久6尤物| 中文在线资源观看视频网站免费不卡| 中文字幕日韩欧美在线| 亚洲人成电影在线| 26uuu另类亚洲欧美日本老年| 欧美日韩综合视频| 国产一区二区三区欧美| 欧美黄色三级网站| 欧美日韩在线免费| 成人在线免费观看视视频| 青青青国产精品一区二区| 精品女同一区二区三区在线播放| 精品中文字幕久久久久久| 国产精品久久久久久av福利软件| 亚洲欧美国产一本综合首页| 亚洲美女av黄| 色妞欧美日韩在线| 亚洲第一中文字幕在线观看| 91影视免费在线观看| 亚洲人成网站色ww在线| 亚洲欧美日本精品| 亚洲精品午夜精品| 日韩在线观看精品| 国产免费亚洲高清| 中国日韩欧美久久久久久久久| 日韩中文在线观看| 日韩国产欧美区| 亚洲人成人99网站| 午夜精品久久久久久久久久久久久| 欧美一区深夜视频| 日本免费一区二区三区视频观看| 九九久久综合网站| 国产精品亚洲视频在线观看| 久久久精品免费视频| 成人女保姆的销魂服务| 日韩一区二区精品视频| 久久精品视频在线播放| 国产情人节一区| 久久综合五月天| 国产精品96久久久久久| 日韩视频免费看| 国产成人精品免费视频| 精品调教chinesegay| 亚洲综合色激情五月| 91a在线视频| 最新亚洲国产精品| 国产亚洲欧美另类中文|