当前位置:  开发笔记 > 编程语言 > 正文

BASE HREF,javascript和Internet Explorer vs. Firefox

如何解决《BASEHREF,javascript和InternetExplorervs.Firefox》经验,为你挑选了2个好方法。

题:

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的最佳方法是什么?



1> ElBel..:

使用assignwindow.location 的方法似乎是最简单的答案.

代替

window.location = URI;

我正在使用这个:

window.location.assign( URI ); 

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


不,这不能解决IE中的基本href问题(从版本8开始).当我看到可以解决的简单问题时,我脸上露出了笑容,但它只持续了一分钟.

2> bobince..:

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属性并手动预先添加

可能我会做什么,是的,如果你已经死了使用.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有