0

我有一个 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 中起作用?

蒂亚!

4

2 回答 2

0

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

于 2008-12-03T22:19:38.600 回答
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);
        }
    }
}
于 2008-12-11T15:22:35.660 回答