题:
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/ foxtrot/ProcessUserInput.php aka
$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的最佳方法是什么?
使用assign
window.location 的方法似乎是最简单的答案.
代替
window.location = URI;
我正在使用这个:
window.location.assign( URI );
这在IE和Firefox中都是正确的.
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
因此将其设置为相对URL似乎是一个未定义的操作.
(*:link.click()是IE和Opera支持的非标准方法)
读取BASE标记的HREF属性并手动预先添加
可能我会做什么,是的,如果你已经死了使用