2008-12-03 109 views
0

我有一個Javascript來改變鏈接中的主機以匹配當前的開發/測試服務器。Safari和Javascript - 同源策略?

下面是一個例子:

var ndomain = document.domain; 
var mydomain = 'www.foo.com'; 
var alink = document.getElementsByTagName('a'); 
for (var i = 0; i < alink.length; i++) { 
    if (alink[i].href.length > 0){ 
     if (alink[i].host.substr(0, mydomain.length) == mydomain){ 
      alink[i].host = ndomain; 
     } 
    } 
} 

改變以http://level1.test.foo.com/page.htmlhttp://www.foo.com/page.html引用。

這適用於我測試過的每個瀏覽器,除了Safari(Mac或Win)。我已經搜索並搜索了關於爲什麼,以及我提出的最接近的原因是「同源政策」的信息。

根據我對同源策略的理解,這應該是可行的,因爲一切都在foo.com域之下。難道Safari會更加嚴格,因爲我要去兩級子域(例如level1.test)?

能有人建議,爲什麼這過程不會在Safari工作,或者我怎麼才能得到它在Safari工作?

TIA!

回答

0

這不應該與相同的原產地政策有任何關係。

在谷歌瀏覽器中也可以看到。兩者都使用WebKit,所以也許WebKit DOM接口是問題的關鍵。

在Chrome中的問題中運行JS不會更改鏈接中的主機。 JS調試器和JS控制檯都沒有報告任何問題。

試圖改變anchor.host屬性將導致:

  • 沒有錯誤要報告
  • 在anchor.host性質沒有改變

這表明anchor.host屬性,由於某種原因,只讀。

anchor.href屬性看起來是可寫的,所以這可能是您最好的選擇。下面的代碼工作:

var ndomain = document.domain; 
var mydomain = 'www.foo.com'; 
var alink = document.getElementsByTagName('a'); 
for (var i = 0; i < alink.length; i++) { 
    if (alink[i].href.length > 0){ 
     if (alink[i].host.substr(0, mydomain.length) == mydomain){ 
      var currentHref = alink[i].getAttribute('href'); 
      var newHref = ''; 

      // Generate newHref based on currentHref and setting host as required 

      alink[i].setAttribute('href', newHref); 
     } 
    } 
} 
0

第5行有語法錯誤(3個開括號,只有2個右括號)。