18

问题:

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 的子目录中。换句话说,他们的实际 URL 是

http://www.example.com/alpha/bravo/UsabilityTest/foxtrot/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 属性并手动添加到var URIjavascript 中,调用完全解析的绝对 URL
  • 用 PHP处理.js文件并将$basehref变量插入到脚本中
  • 移动文件
  • 还有什么?

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

4

6 回答 6

7

使用assignwindow.location 的方法似乎是最直接的答案。

代替

window.location = URI;

我正在使用这个:

window.location.assign( URI ); 

这在 IE 和 Firefox 中都是正确的。

于 2009-03-11T21:48:32.263 回答
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

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

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

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

可能我会做,是的,如果你死心塌地使用 <base>。

于 2009-03-10T23:11:49.763 回答
3

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

如果您想详细了解可以在 window.location 中更改的许多变量,我会在此处查看。根据 Mozilla 的文档,更改 window.location 中的任何变量都应该使用与这些更改对应的新 URL 重新加载页面。

于 2009-03-10T22:14:39.247 回答
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');
于 2014-09-05T09:17:57.067 回答
2

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

document.getElementBytagname('base').href
于 2012-04-29T22:36:45.063 回答
0

你总是可以使用 Vanilla JS :)

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

我希望这有帮助。

于 2017-02-07T23:20:08.710 回答