跨域和JSONP

AJAX經(jīng)常用來異步請求數(shù)據(jù),并且局部更新頁面。但是AJAX有一個很大的問題,它只能請求相同域名下的內(nèi)容。如果是請求不同域名下的內(nèi)容和數(shù)據(jù),不管是什么內(nèi)容,都不會成功。這就需要JSONP來進行跨域請求數(shù)據(jù)。

一、 前提

在JS和HTML中,其實跨域是很常見的。img標簽、script標簽都可以直接跨域來獲取其它網(wǎng)站的內(nèi)容。這就表示,我們通過使用script來跨域請求是完全可行的。而且因為JSON的存在,提供了一種非常適合數(shù)據(jù)交換的語法格式,而JSON恰好又被原生JS支持。

二、 理解JSONP的三個demo
1. 使用script跨域

本地有一個index.html的文件,內(nèi)容如下:

<body>
  <script src="http://127.0.0.1:8080/test.js"></script>
</body>

本地域名為:127.0.0.1:8081,script標簽是在跨域請求
test.js的內(nèi)容:

alert('我是遠程文件')

當在http協(xié)議打開index.html文件時,彈出“我是遠程文件”,表示跨域成功。

2. 稍微變通一下

遠程的test.js改為:

handler({"name":"limingru"})

本地index.html改成:

<body>
  <script>
    function handler(data){
      document.write(data.name)
    }
  </script>
  <script src="http://127.0.0.1:8080/test.js"></script>  //這里就相當于在script標簽里寫了handler({"name":"limingru"}),調(diào)用了上面準備好的函數(shù)。
</body>

這樣,在頁面里就寫入了limingru了。

3.理解JSONP

寫到這里,大致就能理解JSONP的基本邏輯了,JSONP就是通過客戶端通過script腳本來跨域調(diào)用其它服務(wù)器上動態(tài)生成的JS格式的文件,而用于交互的數(shù)據(jù)的格式則是JSON。調(diào)用成功以后,客戶端就跨域獲得了服務(wù)器的數(shù)據(jù),這樣就可以通過JS來展示這些數(shù)據(jù)了。

到這里還有一個問題。就是拿數(shù)據(jù)和給數(shù)據(jù)的雙方要共同約定一種格式,JSONP是通過函數(shù)參數(shù)傳遞的方式來給數(shù)據(jù)的,那給數(shù)據(jù)的一方如何知道拿數(shù)據(jù)的一方的函數(shù)呢?用查詢參數(shù)來約定,比如callback,它們的值就是共同的函數(shù)名稱和其它需要的信息。

來看第三個demo:
本地index.html內(nèi)容為:

<body>
  <div></div>
  <div></div>
  <div></div>
  <script>
    function handler(data){
      var divs = document.querySelectorAll('div')
      divs[0].textContent = data.name
      divs[1].textContent = data.gender
      divs[2].textContent = data.age
    }

    var url = 'http://127.0.0.1:8080/test.js?callback=handler'
    var script = document.createElement('script')
    script.setAttribute('src',url)
    document.querySelector('body').appendChild(script)
  </script>
</body>

index.html文件動態(tài)生成script標簽,并且加上url,在url還給了一個查詢參數(shù)callback=handler,它告訴服務(wù)器返回一個handler來傳遞服務(wù)器的JSON數(shù)據(jù)。
服務(wù)器會根據(jù)查詢參數(shù)生成相應(yīng)的test.js文件:

handler({
  "name":"limingru",
  "gender": "male",
  "age": 18
})

并且將相應(yīng)的數(shù)據(jù)傳過去。這樣,在本地頁面就能展示跨域獲得的數(shù)據(jù)了。

三、用jQuery通過JSONP跨域獲取數(shù)據(jù)

$.ajax({
  type: "get",
  async: false,
  url: "http://xxx.aspx",
  dataType: "jsonp",
  jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(一般默認為:callback)
  jsonpCallback:"flightHandler",//自定義的jsonp回調(diào)函數(shù)名稱,默認為jQuery自動生成的隨機函數(shù)名,也可以寫"?",jQuery會自動為你處理數(shù)據(jù)
  success: function(json){
    alert('您查詢到航班信息:票價: ' + json.price + ' 元,余票: ' + json.tickets + ' 張。')
  },
  error: function(){
    alert('失敗');
  }
})

jQuery將JSONP封裝到了AJAX里,但實際上它們完全不一樣。要記住這一點。

參考文章:說說JSON和JSONP,也許你會豁然開朗,含jQuery用例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動態(tài)腳本技術(shù)。在JavaScript中,有一個很重要的...
    西瓜w閱讀 1,924評論 0 1
  • 本節(jié)內(nèi)容:實現(xiàn)跨域常用的兩種方式 —— JSONP 和 CORS 零:跨域報錯展示 在非同源情況下,調(diào)用 Ajax...
    NathanYangcn閱讀 3,393評論 2 12
  • 0. 前言 說到AJAX就會不可避免的面臨兩個問題。 AJAX以何種格式來交換數(shù)據(jù)? 第二個是跨域的需求如何解決?...
    公子七閱讀 23,797評論 7 67
  • 1.什么是同源策略 1.要了解同源策略,我們必須先知道源即orgin 以百度頁面為例,谷歌瀏覽器打開控制臺:輸入l...
    GarenWang閱讀 1,572評論 2 8
  • 當總經(jīng)理老趙的手摟住我的腰時是什么感覺?那是一種惡心又無力又難過的感覺,那種出境持續(xù)了大概一分鐘。那一分鐘,大概是...
    哥斯拉天下無敵閱讀 808評論 4 3

友情鏈接更多精彩內(nèi)容