日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出jsonp

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出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請求沒有跨域,完美得到結果:

  但是如果我的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就要出馬了!

神奇的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數據,但是報錯如下:

  原因是因為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 });

  當然,這時的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名的話,可以參照上文。

總結

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

  jsonp原理:

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

    以上是生活随笔為你收集整理的深入浅出jsonp的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久艹在线观看 | 欧美日韩一二三 | www欧美色 | 成熟女人毛片www免费版在线 | 亚洲国产无码精品 | 香港一级淫片免费放 | 国产精品无码一本二本三本色 | 国产一级片免费 | jizzjizz中国精品麻豆 | 中文字幕在线观看亚洲 | 91美女免费看 | 久草视频在线播放 | 91n视频| 黑白配高清国语在线观看 | 伊人tv | 人人妻人人澡人人爽久久av | 日本精品久久久 | 久久女人天堂 | 色噜噜色狠狠 | 日韩精品一二三区 | 欧美激情性生活 | 丝袜美腿一区二区三区 | av一级在线 | 日日夜夜综合 | 色婷婷综合久久久中文字幕 | 久久av在线 | 三级网站在线看 | 国语对白清晰刺激对白 | 亚洲国产亚洲 | 免费黄色网址在线观看 | 亚洲影院在线 | 欧美亚洲综合久久 | 日韩第二页 | 午夜小网站| 黄视频免费在线观看 | 日韩精品中文字幕一区 | 国产精品久久av | 宅男在线视频 | 日日夜夜91 | 成人毛片在线观看 | 国产免费不卡视频 | 国产精品一区二区小说 | 小视频免费在线观看 | 免费观看的黄色网址 | 亚洲精品久久久久久宅男 | 亚洲在线免费观看 | 日本一区二区免费高清视频 | 麻豆av一区二区三区久久 | 久久婷婷国产 | 国产精品视频专区 | 久久精品性爱视频 | 中文字幕av一区二区三区 | 无码一区二区三区视频 | 日日摸日日添日日碰9学生露脸 | 五月亚洲综合 | 11一12免费毛片 | 久热一区 | av黄色免费| 闫嫩的18sex少妇hd | av色图片 | 国产富婆一级全黄大片 | 狠狠爱网站 | 亚洲第一页中文字幕 | 农村少妇久久久久久久 | 日日插插| 国产伦精品一区二区三区高清 | 国产毛片在线 | 欧美日韩综合 | 欧美亚洲综合久久 | www.黄在线观看| 在线免费成人 | 亚洲九区 | www夜夜操 | 欧美成人高清视频 | 久久久久久免费视频 | 91国偷自产一区二区三区观看 | 日韩精品在线一区二区三区 | 日韩欧美视频一区二区三区 | 日日日日操 | 国产探花精品一区二区 | 毛片在线网站 | 日本高清免费aaaaa大片视频 | 欧美视频 | 国产男女裸体做爰爽爽 | 国产视频导航 | av在线不卡一区 | 亚洲欧美日韩国产一区二区 | 日韩成人不卡 | 九热这里只有精品 | 久久国产这里只有精品 | 黄色大片免费观看视频 | 国产一区二区三区网站 | bl无遮挡高h动漫 | 亚洲aaaaaaa | www.日韩.com | 国产成人无码久久久精品天美传媒 | 伊人365| 欧美爱爱网址 | 四虎免看黄 |