问题:
IE、Firefox和Safari对于BASE HREF以及JavaScript window.location类型请求的处理似乎不同。首先,这是一个准确的问题描述吗?发生了什么?最好的跨浏览器解决方案是什么?
背景:
我有一个小型的PHP平面网站(实际上是一个可用性测试原型)。
我会在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属性,并手动在JavaScript中将其前缀添加到
var URI
中,调用完全解析的绝对URL - 使用PHP处理.js文件,并将
$basehref
变量插入脚本中 - 移动文件位置
- 其他方法?
我相信还有其他解决方法。如何在JavaScript中处理BASE HREF,让IE和Firefox在JavaScript中应用它的方式不同,哪种方法最好?