Safari和Javascript - 同源策略?

问题描述:

我有一个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!

这不应该与相同的原产地政策有任何关系。

在谷歌浏览器中也可以看到。两者都使用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); 
     } 
    } 
} 

第5行有语法错误(3个开括号,只有2个右括号)。