在前端開(kāi)發(fā)中我們都會(huì)遇到跨域請(qǐng)求的問(wèn)題亲桥,因?yàn)镴avaScript的同源策略轩娶,這是一個(gè)很重要的安全性限制魄缚,這一策略是JavaScript的代碼只能訪問(wèn)在同一域名下的內(nèi)容,不同域名下的腳本不能互相訪問(wèn)喜滨,子域也不能訪問(wèn)捉捅。
采用JSONP跨域請(qǐng)求是一個(gè)很好的方法,但是該方法只適用于GET請(qǐng)求虽风。
JSONP跨域的主要步驟是:
1.前端創(chuàng)建script標(biāo)簽棒口,設(shè)置src(因?yàn)閟cript標(biāo)簽的src可以包含來(lái)自外部域的文件,與img辜膝,iframe標(biāo)簽類似)
2.后臺(tái)返回一個(gè)js變了jsonp无牵,這個(gè)jsonp就是請(qǐng)求后的json數(shù)據(jù)
3.回調(diào)完成后刪除script標(biāo)記(避免瀏覽器內(nèi)存泄漏)
例如:
<script type="text/javascript">
// 得到查詢結(jié)果后的回調(diào)函數(shù)
var flightHandler = function(data){
alert("跨域請(qǐng)求成功"+data.name);
};
// 提供jsonp服務(wù)的url地址(不管是什么類型的地址,最終生成的返回值都是一段javascript代碼)
var url = "http://www.baidu.com/a.js";
// 創(chuàng)建script標(biāo)簽厂抖,設(shè)置其屬性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script標(biāo)簽加入head合敦,此時(shí)調(diào)用開(kāi)始
document.getElementsByTagName('head')[0].appendChild(script);
</script>
a.js文件代碼如下:
localHandler({"name":"我是a.js帶來(lái)的數(shù)據(jù)"});
這個(gè)實(shí)例把遠(yuǎn)程服務(wù)器上的a.js寫(xiě)死了,為了更靈活验游,可以在傳入url是設(shè)置參數(shù),這樣可以告訴服務(wù)器我需要什么樣的函數(shù)保檐,你生成返回給我耕蝉。
這是個(gè)簡(jiǎn)單的例子,關(guān)于跨域還有很多其他的方法夜只,繼續(xù)學(xué)習(xí)~希望在前端開(kāi)發(fā)這條路會(huì)越走越遠(yuǎn)垒在!