javascript location.hash 在 IE 中刷新

IT技术 javascript hash internet-explorer location reload
2021-02-25 13:08:00

我需要修改散列,在进行某些处理后将其删除,这样如果用户刷新它们就不会导致进程再次运行。

这在 FF 中运行良好,但似乎每次我尝试更改哈希时 IE 都会重新加载。我认为它与页面上加载的其他内容有关,尽管我不确定。我有一个加载(与进程相关)的 iframe 以及一些仍在父窗口中获取的脚本。

在所有加载完成后,我似乎无法找到更改哈希的好方法。而且,同时我什至不认为它与负载有关。

关于如何解决这个问题的任何想法?

更奇怪的行为:哈希来自 Web 应用程序中通过重定向的其他位置。我发现如果我只是手动添加哈希,将 #myid 添加到 url,它不会重新加载。我是否在已加载的页面上输入哈希值(将 #myid 添加到现有的 url)或在新选项卡中输入完整的 url 都没有关系。

6个回答

这似乎是 Internet Explorer 的一个错误(用 7 和 8 测试)。

更改 window.location.hash 不应导致重新加载,并且使用哈希值来维护状态是一种常见的 JavaScript 技术。

如果您手动加载页面并使用 JavaScript 更改哈希,它将起作用。

问题是当您从不同的位置重定向到页面时(即:使用 HTTP 标头“位置”),然后修改哈希将导致重新加载。

要解决此错误,您可以:

1)如果您可以控制重定向,则可以用一些 HTML 替换 Location 标头。

<html>
<head>
    <meta http-equiv="refresh" content="0; url=__REDIRECT_LOCATION__">
    <script>window.location = "__REDIRECT_LOCATION__";</script>
</head>
</html>

2)如果没有,您可以尝试在加载页面时重新加载页面。为了防止重新加载循环,您可能需要设置一个 cookie。

window.location = window.location; // window.location.reload() didn't work.

In pseudo code: 

// if is Internet Explorer
//      if ( cookie "reloadPerformed" is not set )
//          set cookie "reloadPerformed" = "1"
//          reload page
//      else 
//          clear cookie "reloadPerformed"

明显的缺点是加载页面会导致两个页面请求和渲染,因此您希望重新加载是页面加载时执行的第一件事。

此错误发生在带有 IE8 的 Windows Vista/Server 2008 上,但不会在带有 IE8 的 Windows 7 上发生...
2021-04-29 13:08:00
如果用户禁用了 cookie,恐怕解决方案#2 会导致循环。
2021-05-14 13:08:00

@JarneCook似乎是对的 - 这是 IE 中的一个错误。

你也许可以这样做:

<script type="text/javascript">
  window.location.hash = window.location.hash;
</script>

在您的页面顶部。在正常情况下,这应该是空操作,但如果用户使用 IE 并通过重定向到达,页面将在他们注意到它已加载之前重新加载。

这是最好的解决方法!IE 会检查 HTTP Referrer,如果重定向,它会丢失。因此,当设置 window.location.hash 时,IE 会在执行后立即刷新页面。
2021-04-27 13:08:00
这个解决方案拯救了我的一天。非常感谢@rjmunro,地狱吧!
2021-05-12 13:08:00
经过一整天的处理 IE9 重定向我的废话,这终于解决了!!!很好的解决方案!!我想在你的代表上给你大约+50
2021-05-16 13:08:00

问题是“哈希值是通过重定向来自 Web 应用程序中的其他位置。 ”。如果您使用 javascript 重定向客户端中的 url,如下所示:

location.href = 'test1.aspx#testhash'

一切都会安好的 !

所以这是IE的bug:当一个web应用程序通过重定向时,浏览器可能只能看到prev url,所以当你修改时location.hash,浏览器看到一个url变化,所以刷新页面。

我的项目中存在类似的问题。但是我们不能使用上面描述的方法,因为当 IE 刷新页面时,预加载的数据被重置。所以,我们使用了浏览器的特性。当您点击 'a' 标签时,onClick 事件首先发生,在事件浏览器使用 'href' 属性进行重定向之后。当 IE 使用带有 hash 的 href 进行重定向时,不存在重新加载。因此,您可以使用 onClick 事件来调用服务器端处理(例如 __doPostBack 用于 asp.net),并且在执行处理时,浏览器将使用 'href' 属性进行重定向。因此,不会重新加载新页面。您也可以window.location = yourNewLocationWithHash在服务器端处理后使用调用。我希望这有帮助 =)

正面临这个问题,正如其中一个答案中所建议的,只有在 302/301 重定向时才会出现问题。如果页面不是重定向,则不会重新加载哈希更改。我正在使用 PHP 进行重定向,并且不想使用 cookie 来停止重定向。

一些IE9浏览器中也存在更多关于这个问题的问题,尝试了5个IE9浏览器,4个重新加载了页面。

这是在头部部分添加的修复:

<!--[if lt IE 10]>
    <script type="text/javascript">
        if(window.location.hash.replace('#','').length > 0
            && window.location.hash.search('stopredirectioninie') == -1)
        {
            window.location.href = window.location.href+'&stopredirectioninie';
        }
    </script>
<![endif]-->