除非使用setTimeout(),否则JavaScript重定向(location.href)会破坏Back按钮

时间:2010-09-17 00:25:49

标签: javascript firefox redirect settimeout location-href

我刚刚在Firefox 3.6 / Mac中遇到过一些奇怪的行为。我怀疑这是一般的Firefox行为。

我创建了两个简单的测试页面,用于更改window.location.href属性以导航到新网址:

如果您使用以下任一文件尝试以下操作:

  • 打开一个新的/空白浏览器标签。
  • 粘贴网址并点击“Enter”。

你会注意到两者之间的一个区别:使用第一个链接,浏览器的“后退”按钮被禁用;使用第二个,它已启用并按照我的预期工作。

两个脚本之间的唯一区别是后者在更改window.location.href之前设置了一秒钟的超时。

我不知道为什么会发生这种情况,我正在尝试实现第二个脚本的行为(“后退”按钮继续按预期工作),而不会给用户造成任何延迟。

我最好的猜测是,Firefox可能会通过设置window.location.href与使用window.location.replace()方法相同来立即“重定向”,因为我认为开发人员在使用前者时常常使用前者使用后者。也许使用setTimeout,因为这会导致代码异步运行,从而使这种行为失败。可能是这样吗?

我没有尝试setTimeout的最小值来达到预期的效果,但我现在就会这样做。我想弄清楚为什么会发生这种情况。

谢谢!

2 个答案:

答案 0 :(得分:2)

您正确地假设在加载页面时设置location.href被视为替换。实际上有两种不同的行为。

首先,从解析标记结果的脚本中设置location.href始终被解释为替换。这是implemented镜像Netscape 4行为和subsequently tweaked

第二个是,作为onload处理程序的结果加载的任何新文档也总是被解释为替换。这是implementedtweaked

但是我很好奇为什么你这么热衷于这样做,因为这意味着用户必须使用Back下拉菜单转到页面之前的页面。 (如果继续将页面重定向到当前页面,则返回一页将毫无用处。)

答案 1 :(得分:1)

  

我最好的猜测是,Firefox可能会通过将window.location.href设置为与使用window.location.replace()方法相同来立即“重定向”,因为我认为开发人员在使用前者时很常见意味着使用后者。也许使用setTimeout,因为这会导致代码异步运行,从而使这种行为失败。可能是这样吗?

我一直told你的猜测是正确的,但现在我看来,HTML5 spec似乎没有提到这个要求(链接到最相关的页面,因为很难链接到没有要求)。