BASE HREF,javascript和Internet Explorer vs. Firefox

时间:2009-03-10 22:08:47

标签: javascript html href

问题:

IE和Firefox / Safari似乎与BASE HREF和Javascript window.location类型请求的处理方式不同。首先,这是对问题的准确描述吗?这是怎么回事?什么是处理这种情况的最佳跨浏览器解决方案?

上下文

我有一个小的PHP平面文件sitelet(它实际上是一个可用性测试原型)。

我在PHP中动态生成BASE标记的HREF值,即如果它在我们公司的服务器上运行,那就是:

$basehref = 'http://www.example.com/alpha/bravo/UsabilityTest/';

在我当地的开发机器上,它是:

$basehref = 'http://ellen.local/delta/echo/foxtrot/UsabilityTest/';    

对于其中一项任务,我会收集一些用户输入,在Javascript中对其进行一些转换,然后使用以下代码发送到服务器:

function allDone() {
    // elided code for simplicity of stackoverflow question
    var URI = "ProcessUserInput.php?";
    URI = URI + "alphakeys=" + encodeURI( keys.join(",") );
    URI = URI + "&sortedvalues=" + encodeURI( values.join(",") );
    window.location = URI;
}

javascript文件(包含函数 allDone())和处理PHP脚本( ProcessUserInput.php )都位于UsabilityTest的子目录中。换句话说,他们的实际网址是

http://www.example.com/alpha/bravo/UsabilityTest/狐步/ ProcessUserInput.php     又名

$basehref . '/foxtrot/ProcessUserInput.php'

问题

IE的JavaScript基本上似乎忽略了BASE HREF。 javascript和PHP处理器位于同一目录中,因此对 ProcessUserInput.php 的调用运行正常。输入得到处理,一切正常。

但是当我在Firefox上测试时,JavaScript 似乎使用BASE HREF,因为脚本的输出被发送到

$basehref . '/ProcessUserInput.php'

这会中断,因为 ProcessUserInput.php 位于basehref的子目录中。但是,如果我将子目录名称添加到javascript中,它将不再适用于IE。

方案吗

我可以想办法解决这个问题:

  • 在Javascript中,读取BASE标记的HREF属性,并在javascript中手动添加到var URI,调用完全解析的绝对URL
  • 使用PHP处理 .js 文件并将$basehref变量插入脚本
  • 移动文件
  • 别的什么?

我确信必须有其他方法来解决这个问题。当IE和Firefox在JavaScript中以不同方式应用时,在JavaScript中处理BASE HREF的最佳方法是什么?

6 个答案:

答案 0 :(得分:7)

使用window.location的assign方法似乎是最简单的答案。

而不是

window.location = URI;

我正在使用它:

window.location.assign( URI ); 

在IE和Firefox中都做对了。

答案 1 :(得分:6)

  

IE和Firefox / Safari似乎与BASE HREF和Javascript window.location类型请求的处理方式不同。

是的,这可以追溯到Netscape-vs-IE的早期阶段。

IE仅在与文档元素交互的点处强制执行base-href。因此,您可以createElement('a')设置相对hrefclick() *,但base-href将被忽略; appendChild它到包含base-href的文档,它将起作用。

在其他浏览器上,base-href被视为全局每个窗口并始终应用。哪个是对的?它似乎没有具体说明。原始JavaScript文档只说location.hash(因此,location应用为字符串):

  

代表完整的网址

因此将其设置为相对URL似乎是一个未定义的操作。

(*:link.click()是IE和Opera支持的非标准方法)

  

读取BASE标记的HREF属性并手动添加

可能我会做什么,是的,如果你已经死定了使用< base>。

答案 2 :(得分:3)

我相信你想修改window.location.pathname,而不是window.location。 window.location是一个Location对象,它有多个变量。结果,改变它的效果没有很好地定义。但是,window.location.pathname被定义为相对于主机的路径,这就是您想要的。

如果你想了解更多关于你可以在window.location中更改的许多变量,我会检查here。根据Mozilla的文档,更改window.location中的任何变量都应该使用与这些更改相对应的新URL重新加载页面。

答案 3 :(得分:3)

我今天遇到了同样的问题,经过一些研究,在IE9中找不到任何方法来覆盖这个问题,我的项目是什么需求,所以,我做了以下方法(基于jquery,但它真的很容易用简单的javascript)。

href = function(url){
    if ($("base").length > 0 ){
        location.href= $("base").attr("href")+url;
    }else{
        location.href = url;
    }
}

然后,改变

location.href= 'emp/start' 

href('emp/start');

答案 4 :(得分:2)

只需在链接前添加$('base').attr('href')即可。 (使用jquery)或

document.getElementBytagname('base').href

答案 5 :(得分:0)

你可以随时使用Vanilla JS :)

var href = document.getElementBytagname('base')[0].href

我希望这会有所帮助。