如何使用jQuery的jsonp解決跨域問題
1.關於jsonp為什麼能解決跨域問題可網上自行搜尋。
此處給兩個個我認為寫的比較明白的部落格
http://www.cnblogs.com/lemontea/archive/2012/12/11/2812268.html
http://www.nowamagic.net/librarys/veda/detail/224/
2.如何使用jQuery的jsonp?
此問題包含兩部分:
部分一:
建立一個提供jsonp服務的站點,這是基礎,如果沒有此步驟,打死你你也測試不了jQuery的jsonp功能。我的做法是
A.首先建立一個站點,叫做testjsonp,其下有一個檔案,叫做somejsonp.php;
B.somejsonp.php中的程式碼如下
<?php
$callback = $_GET['callback'];
$json = "[{\"id\": \"1\", \"name\": \"a\"},{\"id\": \"2\", \"name\": \"b\"}]";
echo $callback."(".$json.");";
?>
用什麼語言不是重點,重點是這個伺服器返回的資料yao是一個字串,字串的格式為 函式名(json物件)。此處的函式名是從客戶端傳來的名叫callback引數讀取的(你也可以起別的名字)。
C.我是啟動apache伺服器,可自行在瀏覽器中輸入地址進行測試 http://localhost:81/testjsonp/somejsonp?callback=?
部分二:
客戶端如何使用jQuery的jsonp功能
現在列出四種寫法
A.
為了讀者能理解jQuery的jsonp的本質,第一種寫法不依賴於任何js庫,如下:
function mycallback(data){
alert(data.length);
}
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://localhost:81/testjsonp/somejsonp?callback=mycallback";
document.getElementByTagName("HEAD")[0].appendChild(script);
B.
jQuery.getJSON("http://localhost:81/testjsonp/somejsonp?callback=?", function(data) {
alert(data[1].name);
});
jQuery的方便體現在雖然伺服器端php傳來的是json的字串,但jQuery自動將其轉化為了json物件,因此可以直接使用data[0].name,
此寫法的關鍵點在於url,一定要有callback=?這部分,如果沒有,那隻能用下面列舉的C方式。
C.
jQuery.ajax({
type: "get",
url: "http://localhost:81/testjsonp/somejsonp",
dataType: "jsonp",
jsonp: "callback",
success: function(data){
alert(data[0].name+data[1].name);
}
});
此方法之所以沒有callback=?是因為jsonp屬性設定了callback,如果不想設定jsonp屬性,那可用D方式。
D.
jQuery.ajax({
type: "get",
url: "http://localhost:81/testjsonp/somejsonp?callback=?",
dataType: "jsonp",
success: function(data){
alert(data[0].name+data[1].name);
}
});
D實際上就是去掉jsonp屬性,然後url採用與B同樣的寫法,即帶有callback=?即可