问题:
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。
方案吗
我可以想办法解决这个问题:
var URI
,调用完全解析的绝对URL $basehref
变量插入脚本我确信必须有其他方法来解决这个问题。当IE和Firefox在JavaScript中以不同方式应用时,在JavaScript中处理BASE HREF的最佳方法是什么?
答案 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')
设置相对href
和click()
*,但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
我希望这会有所帮助。