2010-03-08 86 views
18

我在Javascript中遇到了同源策略問題。我已閱讀了關於使用document.domain變量的解決方法,但我無法使解決方法發揮作用。解決方法是,您應該能夠將document.domain設置爲'example.com',這樣如果您運行foo.example.com的代碼,它可以通過bar.example.com的XHR加載數據。在解決方法在Javascript中使用document.domain的同源策略解決方法

詳情請看這裏:

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

我的示例代碼 - 這不會產生預期的效果 - 從URL運行像http://foo.example.com/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
<script> 
document.domain = 'example.com'; 
window.onload = function() { 
    var req = new XMLHttpRequest(); 
    var url = 'http://bar.example.com/'; 
    req.open('GET', url, true); 
    req.onreadystatechange = function (aEvt) { 
     if (req.readyState == 4) { 
      var elem = document.getElementById('result'); 
      if (req.status == 200) { 
       var data = req.responseText; 
      } else { 
       var data = "Error loading page: " + req.status; 
      } 
      elem.innerHTML = data; 
     } 
    }; 
    req.send(null); 
}; 
</script> 
Result:<hr> 
<div id="result"></div> 
</body> 
</html> 

該代碼的輸出:

 
Result: 
Error loading page: 0 

如果我將url更改爲'http://foo.example.com/',則一切正常。我的示例代碼中是否有錯誤?

我不想使用代理服務器,因爲它們速度較慢,效率較低,並且會增加Web服務器上的流量。如果這個解決方法真的有效,它會非常酷。這個解決方法是「天空中的派」嗎?

回答

3

由於Mic回答了爲什麼它不起作用,我以爲我會分享解決方案,以「如何」進行跨域的工作。看到我的SO帖子here

+0

感謝j0rd4n,這正是我尋找的那種非代理解決方案,即使我正在用document.domain咆哮錯誤的樹。我在他們稱之爲JSONP的方案以及jQuery如何內置此功能方面發現了更多信息,這超出了我的問題範圍,但仍然有趣: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix 2010-03-09 07:35:05

+0

我提到的過程使用JSONP,但是它在手動意義上使用。 jquery將處理JSONP到JavaScript DOM的「接收」,但你仍然需要提供一個返回JSONP文本的服務。在一天結束時,您的服務器頁面必須返回格式化的JSONP。您的JavaScript(無論是jquery,ext-js等)必須調用腳本標記內的腳本。 – 2010-03-09 22:31:25

21

document.domain允許幀/ iframe之間的通信。不是XHR。

<body> 
<iframe src="http://bar.example.com/"></iframe> 
<script> 
    document.domain = 'example.com'; 
    var ifr = document.getElementsByTagName('IFRAME')[0]; 
    ifr.onload = function(e){ 
     //will log the string "BODY" in the console 
     console.log(ifr.contentWindow.document.body.tagName); 
    }; 
</script> 
</body> 

如果用document.domain刪除行,讀contentWindow的內容將引發同源策略錯誤。

+0

我試過了。在chrome中設置document.domain返回網絡錯誤。開發人員工具告訴相同的原產地政策問題。 – user2284570 2015-09-12 00:02:26

+1

您是否嘗試在父域和子域中將「document.domain」設置爲相同的值?如果不是,則會導致錯誤。 – Mic 2015-09-21 08:19:51

+0

我想這是因爲iframe是完全不同的域名。 – user2284570 2015-09-21 10:26:23