JSONP原理及實現(xiàn)跨域方式

JSONP的出現(xiàn)是因為游覽器的同源策略,所謂同源是指所請求的主機,域名,協(xié)議,端口與當(dāng)前相同。同源策略限制了我們無法通過原生的XMLHttpRequest()對象獲取到j(luò)son數(shù)據(jù)。為了突破這個限制,開發(fā)者想出了一個解決方案,JSONP。

什么是JSONP


首先jsonp不是json數(shù)據(jù),JSON是一種數(shù)據(jù)格式,而JSONP是一種數(shù)據(jù)調(diào)用方式,是解決JSON跨域獲取的解決方案。因此JSONP(JSON with Padding)其實是一個非官方的協(xié)議。

JSONP原理


由于同源策略,XMLHttpRequest()對象無法跨域,但<script> 、<img><link>等標(biāo)簽是可以跨域的。所以可以利用<script>標(biāo)簽來向服務(wù)器發(fā)送請求,服務(wù)器端接收到請求后返回一段js代碼,調(diào)用客戶端寫好的方法,并把JSON數(shù)據(jù)傳入該方法中,客戶端即可拿到數(shù)據(jù)。

原理:script請求php文件->php輸出JavaScript文本->文本代碼中包含JSON
數(shù)據(jù)->返回的代碼文本插入到客戶端中->客戶端交互返回的JavaScript文本。

原理知道了,再看下代碼是怎么實現(xiàn)的。
jQuery版:

 $.ajax({
    dataType:'jsonp',
    jsonp:'jsonp_callback',  //后端檢測請求所包含的值是否是jsonp_callback
    url:'http://www.baidu.com/getData.php',
    success:function(){
        //dosomthing
    }
});

JavaScript版:

function json(jsonObj) {
   //dosomthing
}
    
// 調(diào)用jsonHandle,傳入地址、追加參數(shù),服務(wù)器端返回js代碼,
// 并調(diào)用客戶端寫好的json方法并把json數(shù)據(jù)傳入進(jìn)來。
function jsonHandle(url) {
    var script = document.createElement("script");
    script.setAttribute("src",url);
    document.body.appendChild(script);
    
    // 防止 script 標(biāo)簽冗余
    if(oScript) {
      document.body.removeChild(oScript);
    }
}

JSONP總結(jié)


本文已經(jīng)涉及到后端的代碼,但是對后端的代碼不是非常熟悉,故沒有貼出來。但要想掌握好JSONP跨域的知識或者更好的理解,了解后端(比如php)的一些知識是非常有必要的。

最后注意一點!雖然jQuery把JSONP內(nèi)置在了AJAX里,但是一定要清楚,jQuery的AJAX和JSONP是完全不一樣的,一定不能混淆!

最后編輯于
?著作權(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,917評論 0 1
  • 前言:對于跨域請求,很早之前就有去了解過,但因為一直關(guān)注的都是服務(wù)器后端開發(fā),故也就僅僅停留在概念的理解上而沒有機...
    ken_ljq閱讀 90,225評論 6 128
  • 1. 什么是跨域 提起跨域,我們要先了解一下同源政策,需要明確一點的是,同源政策是針對于瀏覽器的,不是針對JS 同...
    plainnany閱讀 1,401評論 0 1
  • 坐在深深的夜里, 閉上眼哪淺淺的過往中, 嘿,她還是記憶中的哪一抹桃花, 靜默在枝頭,斜靠著微風(fēng), 可我不是露水,...
    納豆那么隨意閱讀 440評論 0 3
  • 崩潰了要,我怎么是個這么沒有目標(biāo)這么不堅定的一個傻逼
    糖饅頭閱讀 111評論 0 0

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