關於cross domain ajax 的一些實驗

1. 用jQuery的話, 要用這樣的語法
$.ajax({
  url: queryImageAPI,
  dataType: 'jsonp',
  data: {dm08pagenum: '70675', dm08num: '3499', callback: 'jsonpCallback'},
});

記得dataType 要設定為jsonp  否則不會正常執行  會被瀏覽器擋下來  雖然回傳狀態是200 OK  但完全沒有回應(在firebug的"網路"監測項目裡是回傳空白 在主控台處則是紅字  代表執行發生錯誤)

同時要記得的是jQuery 提供的get() method 不能用於存取跨網域的資料存取
它的dataType 只有xml, json, script, html 而已, 不支援jsonp

Note: 如果呼叫最後因為時間太長而Aborted的話,  應該是存取該URL被拒  所以得不到回應, 和跨網域的存取無關

2. 主機那端回傳的資料格式可以是字串  未必要是json  只是必須要用callback function name來將回傳的資料包起來  這樣回傳回來塞入DOM裡的時候才會去呼叫到指定的callback function
ex(以php為例):
本來回傳的部分是:
$xml = '<rows><row><width>950</width></row></rows>';
echo #xml;

現在要變成 echo $callback . "('" . $xml . "')";
假設$callback = jsonCallback 好了
那browser 端接收到的回傳就會是
jsonCallback('<rows><row><width>950</width></row></rows>')
此時便會把$xml 的整個內容送進jsonCallback 執行

那麼  不用callback function name 把回傳包起來可不可以呢?
答案是不行  經過實驗  會得到下列的error msg
XML can't be the whole program
http://ad3.fashionguide.com.tw/j/AdLoc_www.js?Rnd=387945
Line 10

意思就是說  瀏覽器端預期得到的是一段js 的程式碼  像是這樣
jsonCallback('<rows><row><width>950</width></row></rows>');

它就會自動去執行  如果得到一堆xml code 它就不知道把這段塞進script tag中要做啥

留言

熱門文章