欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

為什么要用jsonp?

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

  假如我寫了個(gè)index頁(yè)面,頁(yè)面里有個(gè)請(qǐng)求,請(qǐng)求的是一個(gè)json數(shù)據(jù)(不知道json數(shù)據(jù)的猛戳JSON簡(jiǎn)介以及用法匯總),簡(jiǎn)單思考寫下如下代碼:

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

  樓主把兩個(gè)文件都放在wamp下的www文件夾下,ajax請(qǐng)求沒有跨域,完美得到結(jié)果:

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

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

<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> 

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

神奇的script標(biāo)簽

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

  接著看上面的index.html代碼,我們看到頁(yè)面引用了百度cdn的jquery路徑,對(duì)于這樣的方式我們似乎已經(jīng)習(xí)以為常,但是仔細(xì)一想,script標(biāo)簽可是完完全全的跨域的啊...沒錯(cuò),jsonp的實(shí)現(xiàn)核心就是利用script標(biāo)簽的跨域能力!于是我們靈機(jī)一動(dòng),似乎可以這么搞,動(dòng)態(tài)生成一個(gè)script標(biāo)簽,把json的url賦值給script的src屬性,然后再把這個(gè)script標(biāo)簽插入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)建了一個(gè)script標(biāo)簽,而標(biāo)簽內(nèi)包裹的內(nèi)容正是需要的json數(shù)據(jù),但是報(bào)錯(cuò)如下:

 

  原因是因?yàn)閖son數(shù)據(jù)并不是合法的js語(yǔ)句,把上面的json數(shù)據(jù)放在一個(gè)回調(diào)函數(shù)中是最簡(jiǎn)單的方法:

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

  當(dāng)然,這時(shí)的a.json文件并不一定要這樣命名,改成a.js也不會(huì)有一點(diǎn)問(wèn)題。

  而如果是與服務(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(即動(dòng)態(tài)生成的script標(biāo)簽的src),無(wú)論看上去是什么形式,最終生成返回的都是一段js代碼。

JQuery對(duì)jsonp的封裝

  為了便于開發(fā),jq對(duì)jsonp也進(jìn)行了封裝,封裝在了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
}); 

  以上代碼是針對(duì)請(qǐng)求文件中寫死了callback函數(shù)名的情況。因?yàn)檎?qǐng)求的是json文件,json不是服務(wù)器端的動(dòng)態(tài)語(yǔ)言不能進(jìn)行解析,如果是php或者其他的服務(wù)器端語(yǔ)言,則不用寫死函數(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.')';
?> 

   當(dāng)然類似的封裝好的方法還有幾種:

// 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方法的請(qǐng)求地址url需要帶上callback=?,因?yàn)閖q對(duì)該方法進(jìn)行封裝的時(shí)候并沒有默認(rèn)回調(diào)函數(shù)變量名為callback,于是php中$_GET['callback']就找不到變量值了。

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

 

總結(jié)

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

  jsonp原理:

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

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

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

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

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

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

ajax和jsonp的區(qū)別:

相同點(diǎn):都是請(qǐng)求一個(gè)url

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

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

相關(guān)文章

  • webpack 插件html-webpack-plugin的具體使用

    webpack 插件html-webpack-plugin的具體使用

    本篇文章主要介紹了webpack 插件html-webpack-plugin的具體使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • javascript 使用sleep函數(shù)的常見方法詳解

    javascript 使用sleep函數(shù)的常見方法詳解

    這篇文章主要介紹了javascript 使用sleep函數(shù)的常見方法,結(jié)合實(shí)例形式分析總結(jié)了javascript sleep函數(shù)的功能、常見使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • JS使用AudioContext實(shí)現(xiàn)音頻流實(shí)時(shí)播放

    JS使用AudioContext實(shí)現(xiàn)音頻流實(shí)時(shí)播放

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何使用AudioContext實(shí)現(xiàn)音頻流實(shí)時(shí)播放功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • JavaScript快速排序(quickSort)算法的實(shí)現(xiàn)方法總結(jié)

    JavaScript快速排序(quickSort)算法的實(shí)現(xiàn)方法總結(jié)

    快速排序的思想式 分治法,選一個(gè)基準(zhǔn)點(diǎn),然后根據(jù)大小進(jìn)行分配,分配然完畢之后,對(duì)已經(jīng)分配的進(jìn)行遞歸操作,最終形成快速排序,所以遞歸也是快速排序思想的一個(gè)重要組成部分,本文主要給大家介紹了JavaScript實(shí)現(xiàn)快速排序的寫法,需要的朋友可以參考下
    2023-11-11
  • webpack中使用zepto步驟方法

    webpack中使用zepto步驟方法

    這篇文章主要為大家介紹了webpack中使用zepto步驟方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • JS時(shí)間特效最常用的三款

    JS時(shí)間特效最常用的三款

    這篇文章主要介紹了最常用的三款JS時(shí)間特效,推薦給大家,有需要的小伙伴可以參考下。
    2015-08-08
  • js代碼解密代碼

    js代碼解密代碼

    在做網(wǎng)頁(yè)時(shí)(其實(shí)是網(wǎng)頁(yè)木馬呵呵),最讓人煩惱的是自己辛辛苦苦寫出來(lái)的客戶端IE運(yùn)行的JAVASCRIPT代碼常常被別人輕易的拷貝,實(shí)在讓自己的心里有點(diǎn)不是滋味,要知道自己寫點(diǎn)東西也挺累的
    2008-06-06
  • chrome下img加載對(duì)height()的影響示例探討

    chrome下img加載對(duì)height()的影響示例探討

    這篇文章主要介紹了chrome下img加載對(duì)height()的影響,需要的朋友可以參考下
    2014-05-05
  • 微信小程序?qū)崿F(xiàn)圓心進(jìn)度條

    微信小程序?qū)崿F(xiàn)圓心進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)圓心進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • js實(shí)現(xiàn)百度淘寶搜索功能

    js實(shí)現(xiàn)百度淘寶搜索功能

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)百度淘寶搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論