# jsonp原理講解
## 原因
> 我們知道瀏覽器出于安全考慮鄙煤,并不容許利用(XMLHTTP/XMLHttpRequest)發(fā)送跨域的ajax請求祝懂。
##解決辦法(這里只討論使用jsonp的方式)
> 同樣我們也知道,對于img,css,script髓堪,是可以跨域引用的, 現(xiàn)在我們假設(shè)有一個網(wǎng)站a(www.a.com)的一個頁面a1.aspx
引用了一個網(wǎng)站b(www.b.com)的javascript比如www.b.com/test.js。test.js里面輸出一個alert(1);
這個結(jié)果我想大家都知道∏苊常現(xiàn)在又假如我們在a1.aspx里面有一個函數(shù)
```javascript
/*a1.aspx頁面內(nèi)容*/
function fa1(){
alert("1");
}
```
而test.js輸出的內(nèi)容為`fa1()`這個時候,顯然瀏覽器也會彈出一個對話框了觉渴,里面的內(nèi)容就是1介劫。 說到這里大家也明白點東西了。
當(dāng)我們需要跨域請求的時候案淋,我們是不是完全可以利用js動態(tài)創(chuàng)建`<script>`標(biāo)簽座韵,而將我們需要的參數(shù)附加的script標(biāo)簽的src地址的后面如下面這樣
```html
<script src="http://www.b.com/test.js?id=12&cd=a"></script>
```
在www.b.com我們就可以得到這些參數(shù),并輸出一個跟服務(wù)器約定好的函數(shù)名踢京,就系那個上面的例子中輸出fa1()一樣誉碴,當(dāng)然了, 我們也可以利用像下面這樣告訴www.b.com上面我們將要服務(wù)器輸出才函數(shù)名字
```
<script src="http://www.b.com/test.js?id=12&cd=a&callback=callsuccess"></script>
```
www.b.com處理完后瓣距,輸出callsuccess();就可以了黔帕。當(dāng)然了callsuccess也是可以有任何參數(shù)的。這實際上就是所謂的jsonp
##jsonp缺點
* 目標(biāo)域的服務(wù)器必須要如你所愿的輸出一些你想要的腳本才可以蹈丸。如上面才callback 成黄,想象一下,假如www.b.com/test.js
輸出的并非callsucess();而是輸出alert(1)....說白了白华, 目標(biāo)域慨默,如果沒有支持jsonp這種形式, 那么你是么有辦法的弧腥。
* 只能是get請求