2008-12-25 44 views
3

我明白(我認爲)XmlHttpRequest對象遵循「相同域」策略。但是,我想創建一個簡單的(POC)本地html文件,它從Web服務器下載XML並執行一些操作(讓我們從一個簡單的「alert()」開始)。Firefox中的跨站點XmlHttpRequest?

有沒有可能?我需要一個特殊的Firefox配置選項嗎?

我試圖下載的服務器是而不是我的控制下的(它實際上是Google API)。

我的簡單嘗試是Mozilla's "Using XMLHttpRequest" page的代碼。它返回一個我從「send」方法中不能理解的錯誤。免責聲明:我主要是一名C/C++開發人員 - 從未做過任何嚴肅的JS編程,從未嘗試過使用這些API。

+0

我一個解決方案回答解決此限制在Firefox在另一個線程:http://stackoverflow.com/questions/330427/can-i-disable-sop-same-origin-policy-on-any-browser -for-development/2771363#2771363 – miek 2010-12-16 12:46:15

回答

3

XMLHttpRequest實際上遵守更嚴格的相同域策略實現:雖然您可以設置document.domain屬性以允許來自兩個子域的JavaScript相互通信,但您無法使用XMLHttpRequestObject 。在你的情況下,轉到一個完全不同的領域,你也不能用JavaScript做到這一點。

有幾個選項。首先,您可以使用反向代理來顯示外部網站是您網站的子網域。看看Apache的mod_proxy,特別是ProxyPassReverse

另一種選擇是將數據作爲JSON對象返回:<腳本src =「foo」>可以從任何地方檢索想要的數據。這不是(容易)重複的(例如來自同一頁面的多個請求)。

我也建議你Google for「google mashups」。它們中的大多數都生活在「googlemashops.com」域中,這使得實現變得更容易。有幾個人住在這個領域之外,可能會給你一些想法。

編輯:而不是直接使用XMLHttpRequest對象,我建議要通過第三方的庫如prototype.js中

1

如果你想檢索XML是由谷歌的JS API之一返回,那麼就不需要XmlHttpRequest(因爲它只能和你的頁面在同一個域上使用)。

在使用谷歌的API,如地圖之一,通常是由您的網頁上添加自己的公共API參考的地方開始的情況下

所以:

<script type="text/javascript" src="http://www.google.com/jsapi?key=your_google_api_key"></script> 

參考然後添加到特定的API ()你打算使用你的頁面:

<script type="text/javascript">google.load("maps", "2");</script> 

現在,您可以通過調用該API提供的各種功能:

<script type="text/javascript"> 
    function initialize() { 
    var map = new google.maps.Map2(document.getElementById("map")); 
    map.setCenter(new google.maps.LatLng(41.86, 87.68), 13); 
    } 
    google.setOnLoadCallback(initialize); 
</script> 

沒有的XmlHttpRequest需要:)

+0

我嘗試使用的API實際上直接返回一個JSON對象。但是這個對象沒有名字,那麼我該如何使用它呢? 如果你登錄到谷歌閱讀器,請參閱: http://www.google.com/reader/api/0/unread-count?output=json – noamtm 2008-12-25 13:53:37

0

使用IE8或者試試。如果你是從磁盤運行,而不是IE8網站將忽略所有正常的域限制,並獲得你想要的數據。

1

您可以使用JSONP來執行此操作。我使用jQuery和PHP來做here。基本上我使用PHP代理來包裝JSON回覆,以便jQuery可以處理它。它在BSD下。

0

使用jQuery(大概XHR,但我儘量不要直接使用它),你可以愉快地做跨域請求,前提是你不指定不尋常的標題或非GET方法。如果你確實想要使用這些,你必須控制服務器來啓用OPTIONS請求。

詳見https://developer.mozilla.org/En/HTTP_access_control