網頁讀取跨網域json方法3:使用ajax讀取跨網域資料xml,關鍵在$.ajax({指定jsonpCallback: "callBackdata"函數,回傳必須是純文字或xml物件),
本題特點是使用button來啟動讀取跨網域json
http://acupun.site/lecture/jquery_phoneGap/18-CrossDomain03-xml.js
(方法3需用chrome瀏覽器才能讀取)
1.注意:
(1).ajaxCall的 資料傳遞方式要選擇get,type: "get"(若選擇post則無法顯示)
function ajaxCall(target){
//發出 ajax call
var data = $.ajax({
type: "get",
//type: "POST", //注意: 設定為post則無法抓到資料
async: true,//async設定false會變成同步請求 要完成ajax後才會繼續執行
url: target,
dataType: "jsonp",
jsonpCallback:"callBackdata",
//callback函式(jsonp的callback函式,預設是callback)
});
目前javascript與jQuery網頁,若要讀取跨網域資料,市場上所使用的方法,幾乎都是借助伺服器端程式php, asp.net, node.js等等來執行call back函數才能達成讀取跨網域端的資料。
2.在此提出一個另類且簡單的快速方法,且不需要php, asp.net等伺服器技術:使用<script src="http://..../example.js">即可讀取任何網址的*.js資料原理,把json,xml放置該example.js 裡面,即可讀到
3.本題實作:
在server遠端伺服器有個18-CrossDomain02-json.js,裡面程式碼的內容是
callBackdata(JSON.stringify([{"id":"1","name":"張瑾雯","englishname":"Mary","address":"北市仁愛路二段56號","tel":"(02) 2555-9857"},{"id":"2",..........1"}])); |
在client本地端網頁18-CrossDomain02-json.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function callBackdata(txt) {
//將字串轉成jsonDoc
var jsonDoc = JSON.parse(txt);
//將jsonDoc輸出成表格資料
str ="<table border=1><tr><td>編號</td><td>姓名</td><td>英文名</td><td>住址</td><td>電話</td></tr>";
for (i=0;i<jsonDoc.length;i++)
{
str +="<tr><td>" + jsonDoc[i].id;
str +="</td><td>" + jsonDoc[i].name;
str +="</td><td>" + jsonDoc[i].englishname;
str +="</td><td>" + jsonDoc[i].address;
str +="</td><td>" + jsonDoc[i].tel;
str +="</td></tr>";
}
str +="</table>";
document.getElementById("id01").innerHTML = str;
}
</script>
</head>
<body>
<p>
<div class="purple1" id="id01"></div>
</p>
<script type="text/javascript" src="http://acupun.site/lecture/jquery_phoneGap/18-CrossDomain02-json.js"> </script>
</body>
</html>
|
注意:
(1).
<script type="text/javascript" src="*.js....>要放在</body>的最下面,
舉例:<div class="purple1" id="id01"></div>若放在<script type="text/javascript" src="*.js....>的下面,則無法在id01處顯示文字
結論:程式控制所顯示的元件,若在<script type="text/javascript" src="*.js....>的下面,都無法顯示
4.將字串讀進到jsonDoc,本身就是一個物件變數陣列,操作法就更傳統javascript的物件變數陣列一樣
5.將字串轉成jsonDoc物件變數的作法,有兩種方法皆可
//方法1: jsonDoc = JSON.parse(txt)
//方法2: jsonDoc =$.parseJSON(txt)
5.json字串與json物件變數彼此轉換的公式
//將json字串轉成json物件: jsonDoc = JSON.parse(jsonString)
//將json物件轉成json字串: jsonString =JSON.stringify(jsonDoc)
6.在遠端伺服器的call.js,callBackdata("...")裡面的字串為什麼要用JSON.stringify([{"id":"1","name":"張瑾雯","englishname":"Mary","address":"北市仁愛路二段56號","tel":"(02) 2555-9857"},{"id":"2",..........1"}])
//原因:
(1).[{"id":"1","name":"張瑾雯","englishname":"Mary","address":"北市仁愛路二段56號","tel":"(02) 2555-9857"},{"id":"2",..........1"}],這個是json物件陣列,本身是陣列,不是字串
(2).但是callBackdata("...")裡面要的是字串
(3).所以必須使用轉換函數
//將json物件轉成json字串: jsonString =JSON.stringify([{....},{.....},{....}])
(4).然後到了client端18-CrossDomain02-json.html網頁,所接收到是字串,還要將字串轉換成json物件陣列
//將json字串轉成json物件: jsonDoc = JSON.parse(txt)
7.:注意:
(1).在server遠端伺服器有個18-CrossDomain02-json.js,裡面的xml內容,不可以有換行符號
(2).這種讀進跨網域*.js技術,缺點是:必須在clinet網頁,網頁一打開onload時,就讀進跨網域*.js裡面的全部資料(因為<script type="text/javascript" src="http://.....js">),必須放在<body>...</body>的最後面,也就是網頁一打開,<body>一顯示,就會執行跨網頁的所有*.js