# jsonp原理講解
## 原因
> 我們知道瀏覽器出于安全考慮,并不容許利用(XMLHTTP/XMLHttpRequest)發送跨域的ajax請求。
##解決辦法(這里只討論使用jsonp的方式)
> 同樣我們也知道,對于img,css,script,是可以跨域引用的, 現在我們假設有一個網站a(www.a.com)的一個頁面a1.aspx
引用了一個網站b(www.b.com)的javascript比如www.b.com/test.js。test.js里面輸出一個alert(1);
這個結果我想大家都知道。現在又假如我們在a1.aspx里面有一個函數
```javascript
/*a1.aspx頁面內容*/
function fa1(){
alert("1");
}
```
而test.js輸出的內容為`fa1()`這個時候,顯然瀏覽器也會彈出一個對話框了,里面的內容就是1。 說到這里大家也明白點東西了。
當我們需要跨域請求的時候,我們是不是完全可以利用js動態創建`<script>`標簽,而將我們需要的參數附加的script標簽的src地址的后面如下面這樣
```html
<script src="http://www.b.com/test.js?id=12&cd=a"></script>
```
在www.b.com我們就可以得到這些參數,并輸出一個跟服務器約定好的函數名,就系那個上面的例子中輸出fa1()一樣,當然了, 我們也可以利用像下面這樣告訴www.b.com上面我們將要服務器輸出才函數名字
```
<script src="http://www.b.com/test.js?id=12&cd=a&callback=callsuccess"></script>
```
www.b.com處理完后,輸出callsuccess();就可以了。當然了callsuccess也是可以有任何參數的。這實際上就是所謂的jsonp
##jsonp缺點
* 目標域的服務器必須要如你所愿的輸出一些你想要的腳本才可以。如上面才callback ,想象一下,假如www.b.com/test.js
輸出的并非callsucess();而是輸出alert(1)....說白了, 目標域,如果沒有支持jsonp這種形式, 那么你是么有辦法的。
* 只能是get請求