问题:
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 URI
javascript 中,调用完全解析的绝对 URL - 用 PHP处理.js文件并将
$basehref
变量插入到脚本中 - 移动文件
- 还有什么?
我相信也必须有其他方法来解决这个问题。当 IE 和 Firefox 在 JavaScript 中以不同方式应用它时,在 JavaScript 中处理 BASE HREF 的最佳方法是什么?