JavaScript中Jsonp的原理是如何實現JSON跨域訪問的一個技術,它通過利用script標簽中可以跨域訪問資源的特性,來實現JSON數據的跨域請求和響應。
舉個例子來說明Jsonp的使用場景。假設有一個頁面www.a.com,它想要訪問www.b.com的JSON數據,但是由于瀏覽器的同源策略,它們處于不同的域名下,無法直接訪問。這時候,可以通過Jsonp來解決跨域問題。
function jsonp(url, callback) { const script = document.createElement('script'); script.src = url + '?callback=' + callback; document.body.appendChild(script); } jsonp('http://www.b.com/data.json', 'dataHandler'); function dataHandler(data) { console.log(data); }
上面的代碼中,我們通過動態創建script標簽來加載www.b.com中的JSON數據,并傳遞一個回調函數dataHandler作為參數。在www.b.com中,我們需要將JSON數據放在回調函數的參數中,以便被返回給www.a.com。
var data = {"name": "張三", "age": 18}; var callback = req.query.callback; res.send(callback + '(' + JSON.stringify(data) + ')');
在www.b.com的服務器端,我們需要將JSON數據包裹在回調函數中返回給www.a.com,以便在www.a.com中被dataHandler回調函數所接收。
Jsonp的原理是什么呢?它利用了script標簽的src屬性是可以跨域請求資源的特性。Jsonp的具體實現步驟如下:
- 在www.a.com中定義一個回調函數dataHandler,該函數用于處理www.b.com中返回的JSON數據。
- 通過動態創建script標簽,將www.b.com中的JSON數據地址拼接回調函數的名稱作為參數,作為script標簽的src屬性。
- 在www.b.com中,將JSON數據包裹在回調函數中返回給www.a.com。
- 當www.a.com中script標簽的src屬性所請求的資源返回時,dataHandler回調函數被調用,從而將www.b.com中返回的JSON數據作為參數傳入該函數中。
- www.a.com中的dataHandler回調函數就可以處理www.b.com中返回的JSON數據了。
Jsonp的優缺點如下:
- 優點:能夠實現跨域請求JSON數據,適用于一些不需要高安全的場景,例如天氣預報、股票行情等。
- 缺點:由于Jsonp是利用script標簽的src屬性來請求資源的,因此回調函數必須定義在全局作用域中,造成了全局變量的污染。同時,由于Jsonp只支持GET方法的請求,所以無法使用POST方法傳遞參數,限制了使用場景。
下一篇css樣式中的注釋