最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Jsonp 關(guān)鍵字詳解及json和jsonp的區(qū)別,ajax和jsonp的區(qū)別

 更新時間:2015年12月30日 09:55:46   作者:Scott丶  
這篇文章主要介紹了Jsonp 關(guān)鍵字詳解及json和jsonp的區(qū)別,ajax和jsonp的區(qū)別 的相關(guān)資料,需要的朋友可以參考下

前言

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

為什么要用jsonp?

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

  假如我寫了個index頁面,頁面里有個請求,請求的是一個json數(shù)據(jù)(不知道json數(shù)據(jù)的猛戳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請求沒有跨域,完美得到結(jié)果:

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

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

<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就要出馬了!

神奇的script標簽

  與jsonp息息相關(guān)的是script標簽,而xhr或者說傳統(tǒng)意義上的ajax與之沒有半毛錢關(guān)系!

  接著看上面的index.html代碼,我們看到頁面引用了百度cdn的jquery路徑,對于這樣的方式我們似乎已經(jīng)習以為常,但是仔細一想,script標簽可是完完全全的跨域的啊...沒錯,jsonp的實現(xiàn)核心就是利用script標簽的跨域能力!于是我們靈機一動,似乎可以這么搞,動態(tài)生成一個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> 

  我們創(chuàng)建了一個script標簽,而標簽內(nèi)包裹的內(nèi)容正是需要的json數(shù)據(jù),但是報錯如下:

 

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

<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
}); 

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

  而如果是與服務(wù)端交互也是一樣的道理,比如和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(即動態(tài)生成的script標簽的src),無論看上去是什么形式,最終生成返回的都是一段js代碼。

JQuery對jsonp的封裝

  為了便于開發(fā),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函數(shù)名的情況。因為請求的是json文件,json不是服務(wù)器端的動態(tài)語言不能進行解析,如果是php或者其他的服務(wù)器端語言,則不用寫死函數(shù)名,比如下面這樣:

<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對該方法進行封裝的時候并沒有默認回調(diào)函數(shù)變量名為callback,于是php中$_GET['callback']就找不到變量值了。

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

 

總結(jié)

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

  jsonp原理:

 1.首先在客戶端注冊一個callback, 然后把callback的名字傳給服務(wù)器。
 2.服務(wù)器先生成 json 數(shù)據(jù)。 然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數(shù) jsonp. 最后將 json 數(shù)據(jù)直接以入?yún)⒌姆绞剑胖玫?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
 3.客戶端瀏覽器,解析script標簽,并執(zhí)行返回的 javascript 文檔,此時數(shù)據(jù)作為參數(shù),傳入到了客戶端預(yù)先定義好的 callback 函數(shù)里.(動態(tài)執(zhí)行回調(diào)函數(shù))

 json和jsonp的區(qū)別,ajax和jsonp的區(qū)別

 json和jsonp雖然只有一個字母的區(qū)別,但是它們之間扯不上關(guān)系。

json是一種輕量級的數(shù)據(jù)交換格式。

jsonp是一種跨域數(shù)據(jù)交互協(xié)議。

json的優(yōu)點:(1)基于純文本傳遞極其簡單,(2)輕量級數(shù)據(jù)格式適合互聯(lián)網(wǎng)傳遞,(3)容易編寫和解析。

ajax和jsonp的區(qū)別:

相同點:都是請求一個url

不同點:ajax的核心是通過xmlHttpRequest獲取內(nèi)容

    jsonp的核心則是動態(tài)添加<script>標簽來調(diào)用服務(wù)器 提供的js腳本。

相關(guān)文章

  • JS圖片懶加載的優(yōu)點及實現(xiàn)原理

    JS圖片懶加載的優(yōu)點及實現(xiàn)原理

    這篇文章主要介紹了JS圖片懶加載的優(yōu)點及實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 基于canvas實現(xiàn)的鐘擺效果完整實例

    基于canvas實現(xiàn)的鐘擺效果完整實例

    這篇文章主要介紹了基于canvas實現(xiàn)的鐘擺效果,以完整實例形式分析了JavaScript結(jié)合html5的canvas技術(shù)實現(xiàn)鐘擺動態(tài)旋轉(zhuǎn)效果的方法,需要的朋友可以參考下
    2016-01-01
  • 微信小程序如何實現(xiàn)精確的日期時間選擇器

    微信小程序如何實現(xiàn)精確的日期時間選擇器

    這篇文章主要介紹了微信小程序如何實現(xiàn)精確的日期時間選擇器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 一文總結(jié)JavaScript中常見的設(shè)計模式

    一文總結(jié)JavaScript中常見的設(shè)計模式

    在程序設(shè)計中有很多實用的設(shè)計模式,而其中大部分語言的實現(xiàn)都是基于“類”。在程序設(shè)計中有很多實用的設(shè)計模式,而其中大部分語言的實現(xiàn)都是基于“類”。,本文將總結(jié)了JavaScript中常見的十五種設(shè)計模式,感興趣的朋友可以參考下
    2023-05-05
  • js操作CheckBoxList實現(xiàn)全選/反選(在客服端完成)

    js操作CheckBoxList實現(xiàn)全選/反選(在客服端完成)

    對于CheckBoxList控件來說,一方面要實現(xiàn)大量數(shù)據(jù)在服務(wù)器端的綁定工作,另一方面往往要求實現(xiàn)全選、反選等功能,接下來將介紹js操作CheckBoxList實現(xiàn)全選/反選,感興趣的朋友可以了解下,或許對你有所幫助
    2013-02-02
  • JavaScript函數(shù)參數(shù)使用帶參數(shù)名的方式賦值傳入的方法

    JavaScript函數(shù)參數(shù)使用帶參數(shù)名的方式賦值傳入的方法

    這篇文章主要介紹了JavaScript函數(shù)參數(shù)使用帶參數(shù)名的方式賦值傳入的方法,實例分析了javascript函數(shù)傳遞參數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 輕松實現(xiàn)Bootstrap圖片輪播

    輕松實現(xiàn)Bootstrap圖片輪播

    這篇文章主要介紹了全面解析Bootstrap圖片輪播效果,Bootstrap提供了carousel插件,實現(xiàn)圖片輪播非常方便,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 小程序?qū)崿F(xiàn)懸浮搜索框

    小程序?qū)崿F(xiàn)懸浮搜索框

    這篇文章主要為大家詳細介紹了小程序?qū)崿F(xiàn)懸浮搜索框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • JS組件Bootstrap導航條使用方法詳解

    JS組件Bootstrap導航條使用方法詳解

    這篇文章主要為大家詳細介紹了JS組件Bootstrap導航條的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 源碼分析Django的message組件

    源碼分析Django的message組件

    這篇文章主要介紹了源碼分析Django的message組件,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論

枣强县| 达孜县| 鄂州市| 治多县| 安远县| 伊吾县| 武强县| 密山市| 原平市| 涞源县| 赤城县| 湘西| 蛟河市| 克山县| 凉城县| 左云县| 平顺县| 喀喇| 新竹市| 乌兰察布市| 拜泉县| 托克逊县| 泗阳县| 紫阳县| 修文县| 湖南省| 伊金霍洛旗| 和田县| 德清县| 汾西县| 铅山县| 塘沽区| 重庆市| 丹阳市| 岚皋县| 太仆寺旗| 巫山县| 江城| 梅州市| 昌平区| 武城县|