from : http://www.myquickphp.com/archives/147
(請求的跨域服務(wù)器不支持常規(guī)”?”查詢請求時(shí)的解決方案)
昨天第一次做VIP需求時(shí),發(fā)現(xiàn)一個(gè)超奇怪的問題,我有以下URL地址:
http://dynamic.vip.xxxxxx.com/active/<controllers>/<active>/<id>
放在瀏覽器地址欄中訪問可以得到正確的輸出,但我一放到 AJAX 中去異步請求后用 FireBug 調(diào)試時(shí)確怎么都不出結(jié)果,和水龍兄一起調(diào)試了很久都沒有發(fā)現(xiàn)是什么問題,由于這個(gè)URL對方的程序是用XX框架寫的,我是第一次使用這個(gè)XX框架進(jìn)行開發(fā),對它不是很熟(有時(shí)間要研究一下它的內(nèi)核源碼),總以為是它什么地方有設(shè)置影響了的;就在我快要吐血時(shí),樂鋒(對這塊比較了解的哥們)終于上線了,我把問題向他說下后,他第一反應(yīng)就是:”你是不是跨域訪問了。。”
OH FUCK
,我和水龍一直研究程序邏輯,竟然忽視了自己的當(dāng)前域名,因?yàn)槲耶?dāng)前執(zhí)行請求的域名是:

http://vip.xxxxxx.com/active1/index.html
問了一下樂鋒,現(xiàn)系統(tǒng)中已提供的幾個(gè)方案(函數(shù))都不太令人滿意或太煩瑣了,和樂鋒討論了幾種方案后,一時(shí)沒有找到最好解決方案,一看時(shí)間,22:00了,天色已晚,不打擾他晚上陪老婆了!回到家里本想通過利用 iframe 來加載跨域的 url 來得到 dom 數(shù)據(jù),研究后發(fā)現(xiàn)的想法太天真了,JS的安全策略跟本不允許我這樣做;想通過 proxy 代理的方案,但想了一下,那比現(xiàn)在系統(tǒng)中所使用的方案更麻煩,詳細(xì)研究了一下jQuery最新版關(guān)于跨域的解決方案后,終于讓我研究出了一種非常方便的解決方案:
如下是代碼示例:
—————— http://a.com/index.html ——————-
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
/*
AJAX跨域問題完美解決方案
研究:袁維
啟示:樂鋒
*/
function jsonCallBack(url,callback)
{
$.getScript(url,function(){
callback(json);
});
}
function fun1()
{
jsonCallBack('http://b.com/b.php',function(json){
alert(json.message);
})
}
</ script>
<button type="button" onclick="fun1()">跨域訪問</button>
—————— http://b.com/b.php ——————-
<?php
$ary = array('result'=>0,'message'=>'跨域成功');
$json = json_encode($ary);
//一定要這樣定義輸出最后的JSON數(shù)據(jù),這是利用JS的閉包特性
echo "var json=$json;";
?>
該方案注意事項(xiàng):
1:jQuery的版本必需大于 1.2版,否則不支持跨域處理
2:只支持 GET 方式的請求
2:請求的 URL 必需按如下例子中那樣返回?cái)?shù)據(jù).
該方案注意利弊:
優(yōu)點(diǎn):
1:比用 iframe 加輸出 parent.XXX() 的方案簡單高效明了,前端處理更方便
2:相當(dāng) proxy 方式在編程上也簡單多了
缺點(diǎn):
1:必需使用jQuery,
2:返回的數(shù)據(jù)格式必需按示例樣,當(dāng)然不限于JSON,但它是處理最方便的.
(跨域服務(wù)器支持常規(guī)”?”查詢請求的解決方案,利用JQuery的JSONP)
——————— http://b.com/index ———————-
<script src="jquery-1.4.2.js" type="text/javascript"></script>
<script type="text/javascript">
function fun1()
{
$.getJSON("http://a.com/c.php?no=10&msg=ok&format=json&jsoncallback=?",
function(data){
alert(data.msg);
});
}
</script>
<button type="button" onclick="fun1()">跨域處理</button>
——————– http://a.com/c.php ———————-
<?php
$no = $_GET['no'];
$msg = $_GET['msg'];
$json = json_encode(array('no'=>$no,'msg'=>$msg));
//必需以下這樣輸出
echo $_GET['jsoncallback'].'('.$json.')';
別說你把基本思想弄出來,其他的自己看著辦。
用iframe不就行了?