PHP教學 - 利用 jsonp 進行跨網域 ajax 二
JSONP 是利用在頁面生成 <script src="跨網域.js"></script> 的方式來取得跨網域的資料,
這可以解決 AJAX 不能直接跨網域的問題。
(註:除了 JSONP,也可用 AJAX + 另外一支讀取跨網域資料的伺服器端程式,亦能讀取跨網域資料)
而 jQuery 也將 JSONP 的方法,加到 AJAX 的 API 中,所以使用方式跟 AJAX 差不多。
以下範例是 http://192.168.0.101/jsonp/index2.html 取得跨網域 http://192.168.0.100/jsonp/jsonp2.php 的資料。
http://192.168.0.101/jsonp/index2.html 內容如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$.ajax({
type: "get",
async: false,
url: "http://192.168.100/jsonp/jsonp2.php",
dataType: "jsonp",//指定以jsonp方式執行
jsonp: "mycallback",//"mycallback"會以GET的變數名稱傳送,沒指定時,jQuery使用"callback"當變數名稱
jsonpCallback:'aaaa',//"mycallback"變數的值,沒指定時,jQuery隨機產生
success: function(res){
alert(res.msg);
},
error: function(){
alert('fail');
}
});
});
</script>
</head>
<body>
</body>
</html>
http://192.168.0.100/jsonp/jsonp2.php 內容如下,因前面指定 "mycallback" 為變數名稱,所以這邊用 $_GET["mycallback"] 取得該變數。
<?php echo $_GET["mycallback"] ?>({
msg: "jsonp test"
})
執行 http://192.168.0.101/jsonp/index2.html 時,JSONP 在背景 request 的 URL 為
http://ff.example.com/2.php?mycallback=aaaa&_=1361294981268
執行後,回傳的結果為
aaaa({
msg: "jsonp test"
})
執行 http://192.168.0.101/jsonp/index2.html 時,若將 jsonpCallback:'aaaa' 這行拿掉時,JSONP 在背景 request 的 URL 如下,此時 mycallback 傳送出去的值,將是 jQuery 隨機產生的
http://ff.example.com/2.php?mycallback=jQuery19109647663270832252_1361263744783&_=1361263744784
執行後,回傳的結果
jQuery19109647663270832252_1361263744783({
msg: "jsonp test"
})
這可以解決 AJAX 不能直接跨網域的問題。
(註:除了 JSONP,也可用 AJAX + 另外一支讀取跨網域資料的伺服器端程式,亦能讀取跨網域資料)
而 jQuery 也將 JSONP 的方法,加到 AJAX 的 API 中,所以使用方式跟 AJAX 差不多。
以下範例是 http://192.168.0.101/jsonp/index2.html 取得跨網域 http://192.168.0.100/jsonp/jsonp2.php 的資料。
http://192.168.0.101/jsonp/index2.html 內容如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$.ajax({
type: "get",
async: false,
url: "http://192.168.100/jsonp/jsonp2.php",
dataType: "jsonp",//指定以jsonp方式執行
jsonp: "mycallback",//"mycallback"會以GET的變數名稱傳送,沒指定時,jQuery使用"callback"當變數名稱
jsonpCallback:'aaaa',//"mycallback"變數的值,沒指定時,jQuery隨機產生
success: function(res){
alert(res.msg);
},
error: function(){
alert('fail');
}
});
});
</script>
</head>
<body>
</body>
</html>
http://192.168.0.100/jsonp/jsonp2.php 內容如下,因前面指定 "mycallback" 為變數名稱,所以這邊用 $_GET["mycallback"] 取得該變數。
<?php echo $_GET["mycallback"] ?>({
msg: "jsonp test"
})
執行 http://192.168.0.101/jsonp/index2.html 時,JSONP 在背景 request 的 URL 為
http://ff.example.com/2.php?mycallback=aaaa&_=1361294981268
執行後,回傳的結果為
aaaa({
msg: "jsonp test"
})
執行 http://192.168.0.101/jsonp/index2.html 時,若將 jsonpCallback:'aaaa' 這行拿掉時,JSONP 在背景 request 的 URL 如下,此時 mycallback 傳送出去的值,將是 jQuery 隨機產生的
http://ff.example.com/2.php?mycallback=jQuery19109647663270832252_1361263744783&_=1361263744784
執行後,回傳的結果
jQuery19109647663270832252_1361263744783({
msg: "jsonp test"
})
留言
張貼留言