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.html到http://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个右括号)。