ajax跨域調用的解決辦法有很多種,我這裡只說兩種:
假設s.cnblogs.com是一個評論系統,只提供javascript方式的調用。news.cnblogs.com是一個新聞系統,這個系統將評論功能委託給s.cnblogs.com。這時news.cnblogs.com發表評論的代碼可能是:
function sendData(data,callback)
{
var xmlHttp=createXmlHttpRequest();
xmlHttp.open('post','http://s.cnblogs.com/postHandler.ashx');
xmlHttp.onreadystatechange=callback;
xmlHttp.send(data);//data包含要發送的資料。
}
這代代碼在IE6中會有一個安全提醒,但在IE7裡面,直接會出錯。因為跨域。
第一種解決方案:document.domain.
1.將sendData代碼存進一個services.htm檔案中。並在services.htm中設定document.domain='cnblogs.com'
2.將services.htm放到s.cnblogs.com網站根目錄下面。
3.在news.cnblogs.com提交評論的頁面加上<iframe id='ajaxFrame' src='http://s.cnblogs.com/services.htm' width='0' height='0'></iframe>
4.在news.cnblogs.com提交評論的頁面加上
function sendData(data,callback)
{
ajaxFrame.window.sendData(data,callback);
}
和document.domain='cnblogs.com';
方案的缺點:
只能解決跨子域的問題。
方案2:動態script 法。
1.在news.cnblogs.com提交評論的頁面加上,<script id='ajaxProxy' src=''></script>
function sendData(data,callback)
{
var proxy=document.getElementById('ajaxProxy');
proxy.src='http://s.cnblogs.com/postHandler.ashx?data="+data;
proxy.onreadystatechange=callback;
}
我個人更喜歡方案2,但方案的一個問題是callback可以做的事情太少,無法接收postHandler.ashx發回的所饋資料。
不過,我覺得有一種變通的方案,那就是直接在postHandler.ashx中輸出js,比如alert('ok');,但我測試了幾次都沒能成功能。感覺可能是我的RP問題。