首頁 web前端 js教程 一看就懂:jsonp詳解_jquery

一看就懂:jsonp詳解_jquery

May 16, 2016 pm 03:57 PM
jsonp

json相信大家都用的多,jsonp我就一直沒有機會用到,但也經常看到,只知道是“用來跨域的”,一直不知道具體是個什麼東西。今天總算搞明白了。下面一步步來搞清楚jsonp是個什麼玩意。

同源策略

首先基於安全的原因,瀏覽器是存在同源策略這個機制的,同源策略阻止從一個來源載入的文件或腳本取得或設定另一個來源載入的文件的屬性。看起來不知道什麼意思,實踐一下就知道了。

1、隨便建兩個網頁

一個連接埠是2698,一個2701,依照定義它們是不同來源的。

2.用jQuery發起不同來源的請求
在2698埠的網頁上新增一個按鈕,Click事件隨便發起兩個向連接埠為2701網域的請求。

複製程式碼 程式碼如下:

$("#getOtherDomainThings").click(function () {
    $.get("http://localhost:2701/Scripts/jquery-1.4.4.min.js", function (data) {
        console.log(data)
    })

    $.get("http://localhost:2701/home/index", function (data) {
        console.log(data)
    })
})


根據同源策略,很明顯會悲劇了。瀏覽器會阻止,根本不會發起這個請求。 (not allowed by Access-Control-Allow-Origin)

OK,原來jsonp是要解決這個問題的。

script標籤的跨域能力
我不知道大家知不知道CDN這個東西,例如微軟的CDN,使用它,我們的網頁可以不提供jQuery,由微軟的網站幫我們提供:

複製程式碼 程式碼如下:



回到我們的2698端口的網頁,上面我們在Click事件裡有一個對2701端口域的jQuery文件的請求,這次使用script標籤來請求。
複製程式碼 程式碼如下:



當然,200,OK了

同樣是連接埠2698的網頁發起對2701域的請求,放在script裡設定scr屬性的OK了,另一個方式就悲劇。利用script的跨域能力,這就是jsonp的基礎。

利用script取得不同來源的json
既然它叫jsonp,很明顯目的還是json,而且是跨域獲取。根據上面的分析,很容易想到:利用js建構一個script標籤,把json的url賦給script的scr屬性,把這個script插入到dom裡,讓瀏覽器去取得。實踐:

複製程式碼 程式碼如下:

function CreateScript(src) {
    $("<script>/script>").attr("src", src).appendTo("body")<br /> }<br /> </script>

新增一個按鈕事件來測試一下:
複製程式碼 程式碼如下:

$("#getOtherDomainJson").click(function () {
    $.get('http://localhost:2701/home/somejson', function (data) {
        console.log(data)
    })
})

首先,第一個瀏覽器,http://localhost:2701/home/somejson這個Url的確是存在一個json的,而且在2698網頁上用script標籤來請求這個2701這個Url也是200OK的,但是最下面報js語法錯誤了。原來用script標籤載入完後,會立即 把回應當js去執行,很明顯{"Email":"zhww@outlook.com","Remark":"我來自遙遠的東方"}不是合法的js語句。

利用script取得異域的jsonp

顯然,把上面的json放到一個回調方法裡是最簡單的方法。例如,變成這樣:

如果有jsonpcallback這個方法,那麼jsonpcallback({"Email":"zhww@outlook.com","Remark":"我來自遙遠的東方"})就是合法的js語句。

由於伺服器不知道客戶端的回呼是什麼,不可能hard code成jsonpcallback,所以就帶一個QueryString讓客戶端告訴服務端,回呼方法是什麼,當然,QueryString的key要遵從服務端的約定,上面的是”callback「。

新增回呼函數:

複製程式碼 程式碼如下:

function jsonpcallback(json) {
    console.log(json)
}

把前面的方法稍微改改參數:
複製程式碼 程式碼如下:

$("#getJsonpByHand").click(function () {
    CreateScript("http://localhost:2701/home/somejsonp?callback=jsonpcallback")
})

200OK,伺服器回傳jsonpcallback({"Email":"zhww@outlook.com","Remark":"我來自遙遠的 東方"}),我們也寫了jsonpcallback方法,當然會執行。 OK順利獲得了json。沒錯,到這裡就是jsonp的全部。

利用jQuery取得jsonp
上面的方式中,又要插入script標籤,又要定義一個回調,略顯麻煩,利用jQuery可以直接得到想要的json數據,同樣是上面的jsonp:

複製程式碼 程式碼如下:

$("#getJsonpByJquery").click(function () {
    $.ajax({
        url: 'http://localhost:2701/home/somejsonp',
        dataType: "jsonp",
        jsonp: "callback",
        success: function (data) {
            console.log(data)
        }
    })
})

得到的結果跟上面類似。

總結

一句話就是利用script標籤繞過同源策略,得到一個類似這樣的數據,jsonpcallback是頁面存在的回呼方法,參數就是想得到的json。

複製程式碼 程式碼如下:

jsonpcallback({"Email":"zhww@outlook.com","Remark":"我來自遙遠的東方"})

ADD 原生js:

複製程式碼 程式碼如下:

點選按鈕>

    函數 $(str){
        回傳 document.getElementById(str)
    }
    函數 CreateScript(src) {
        var Scrip=document.createElement('script');
        Scrip.src=src;
        document.body.appendChild(Scrip);
    }
    函數 jsonpcallback(json) {
            console.log(json);//物件 { email="中國", email2="中國222"}
    }
    $('btn').onclick=function(){
      CreateScript("http://localhost:51335/somejson?callback=jsonpcallback")   
    }
腳本>
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何創建和發布自己的JavaScript庫? 如何創建和發布自己的JavaScript庫? Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能? 如何在瀏覽器中優化JavaScript代碼以進行性能? Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

如何使用瀏覽器開發人員工具有效調試JavaScript代碼? 如何使用瀏覽器開發人員工具有效調試JavaScript代碼? Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

如何使用源地圖調試縮小JavaScript代碼? 如何使用源地圖調試縮小JavaScript代碼? Mar 18, 2025 pm 03:17 PM

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

初學者的打字稿,第2部分:基本數據類型 初學者的打字稿,第2部分:基本數據類型 Mar 19, 2025 am 09:10 AM

掌握了入門級TypeScript教程後,您應該能夠在支持TypeScript的IDE中編寫自己的代碼,並將其編譯成JavaScript。本教程將深入探討TypeScript中各種數據類型。 JavaScript擁有七種數據類型:Null、Undefined、Boolean、Number、String、Symbol(ES6引入)和Object。 TypeScript在此基礎上定義了更多類型,本教程將詳細介紹所有這些類型。 Null數據類型 與JavaScript一樣,TypeScript中的null

如何有效地使用Java的收藏框架? 如何有效地使用Java的收藏框架? Mar 13, 2025 pm 12:28 PM

本文探討了Java收藏框架的有效使用。 它強調根據數據結構,性能需求和線程安全選擇適當的收集(列表,設置,地圖,隊列)。 通過高效優化收集用法

開始使用Chart.js:PIE,DONUT和BUBBLE圖表 開始使用Chart.js:PIE,DONUT和BUBBLE圖表 Mar 15, 2025 am 09:19 AM

本教程將介紹如何使用 Chart.js 創建餅圖、環形圖和氣泡圖。此前,我們已學習了 Chart.js 的四種圖表類型:折線圖和條形圖(教程二),以及雷達圖和極地區域圖(教程三)。 創建餅圖和環形圖 餅圖和環形圖非常適合展示某個整體被劃分為不同部分的比例。例如,可以使用餅圖展示野生動物園中雄獅、雌獅和幼獅的百分比,或不同候選人在選舉中獲得的投票百分比。 餅圖僅適用於比較單個參數或數據集。需要注意的是,餅圖無法繪製值為零的實體,因為餅圖中扇形的角度取決於數據點的數值大小。這意味著任何占比為零的實體

See all articles