Safari& Javascript - 同源政策?

时间:2008-12-03 20:21:08

标签: javascript security 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://www.foo.com/page.html 的引用更改为 http://level1.test.foo.com/page.html

这适用于我测试的每个浏览器,除了Safari(Mac或Win)。我搜索并搜索了有关原因的信息,而我最接近的原因是“同源政策”。

根据我对同源政策的理解,这应该有效,因为一切都在 foo.com 域下。 Safari是否会更严格,因为我要进入两级子域(例如 level1.test )?

有人可以建议为什么这个过程在Safari中不起作用,或者我如何让它在Safari中工作?

TIA!

2 个答案:

答案 0 :(得分:0)

你在第5行遇到语法错误(3个左括号,只有2个右括号)。

答案 1 :(得分:0)

这与原始政策不应该有任何关系。

在Google Chrome中也可以看到相同的内容。两者都使用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);
        }
    }
}
相关问题