【问题标题】:javascript location.hash refreshing in IEIE中的javascript location.hash刷新
【发布时间】:2011-02-05 19:58:54
【问题描述】:

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

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

我似乎想不出在所有加载完成后更改哈希的好方法。而且,同时我什至不能肯定它与负载有关。

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

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

【问题讨论】:

  • 能否提供复制步骤?我有一个使用转义片段 URL(#!,又名 hash-bang)的网站,我无法重现此错误。在 IE9.0.8 和 IE10RP 上测试。

标签: javascript hash internet-explorer location reload


【解决方案1】:

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

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

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

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

要解决此错误,您可以:

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

<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"

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

【讨论】:

  • 如果用户停用了 cookie,恐怕解决方案#2 会导致循环。
  • 此错误发生在带有 IE8 的 Windows Vista/Server 2008 上,但不会发生在带有 IE8 的 Windows 7 上...
【解决方案2】:

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

你也许可以这样做:

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

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

【讨论】:

  • 这是最好的解决方法! IE 检查 HTTP Referrer,如果发生重定向,它会丢失。因此,当设置了 window.location.hash 时,IE 会在执行时立即刷新页面。
  • 这个解决方案拯救了我的一天。非常感谢@rjmunro,并且 GO TO HELL IE !
  • 在处理了一整天的 IE9 重定向后,终于解决了!很好的解决方案!!我想在你的代表上给你大约 +50
【解决方案3】:

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

location.href = 'test1.aspx#testhash'

会好的!

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      <!--[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]-->
      

      【讨论】:

        【解决方案6】:

        这是一个跨浏览器的解决方案。适用于 IE、Chrome、Safari 和 FF(已试用最新版本)。

        var pos = location.href.indexOf('c=');
        location = (pos < 0 ?
                            location + (location.href.indexOf('?') < 0 ? '?' : '&')
                            : location.href.substring(0, pos))
                   + 'c=' + Math.floor(Math.random()*11) + '#' + comment_id ;
        

        基本上,我利用查询(“?”)字符串来触发带有哈希的页面重新加载。第一行的作用是检查是否存在我们的“黄金”查询字符串(我使用代表“评论”的“c”变量)。如果有的话,

        1. 新 URL 将包含 "c=";
        2. 之前的所有内容
        3. 然后添加我们的金色“c=”+ 0 到 10 之间的随机数 +“#”+ 我的评论 ID,当重新加载时浏览器需要跳转到该评论 ID。

        如果没有,

        1. 新 URL 将拥有旧 URL 曾经拥有的所有内容;
        2. 如果旧 URL 已经包含一些其他查询字符串(“?”之后的内容),请添加查询附加运算符“&”;
        3. 如果没有“?”,则添加它;
        4. 然后进行上述“黄金”查询。

        我在“?”之后添加随机数的原因是不是在第一次重新加载后有类似“?#comment-10”的东西。在这种情况下,对 URL 的下一次更改不会重新加载页面,因为浏览器将其理解为锚点跳转指令。

        要强制重新加载,我们需要在查询中添加一些随机的东西,以便新的 URL 与之前的不同。

        此解决方案适用于所有浏览器,并确保重新加载不会破坏现有查询。唯一的注意是确保您的“黄金”查询变量名称是唯一的。

        希望这会有所帮助。

        【讨论】:

          【解决方案7】:

          我们遇到了同样的问题。

          在我们的例子中,它包含一个由 Apache 重定向到 https 的 http URL。由于哈希符号后面的字符串从未传递给服务器,因此它丢失了。

          【讨论】:

            【解决方案8】:

            如果您使用 javascript 设置哈希,请不要使用“#”

            window.location.hash = '#foo'; //IE will reload the page
            window.location.hash = 'foo'; //IE will set the hash but will not reload the page
            

            【讨论】:

              【解决方案9】:

              在我看来,如果您更改哈希值,您基本上就是在更改页面的位置,因此 IE(或任何浏览器)会重新加载。你是如何做到这一点的? window.location.hash = ""; ?

              也许 Firefox 足够聪明,可以看到你在做什么并避免刷新。

              【讨论】:

              • 关于哈希的事情是它不被浏览器视为物理位置的一部分,它只是客户端的一部分,它不会发送到服务器。它不应该在任何浏览器中重新加载页面,它应该将您带到页面上的锚点。
              • 好吧,我刚刚在 IE8 中尝试过,但它否定了我的答案 :) -- 我在一个页面上放了几个按钮。一方面,我将 window.location.hash 设置为一个值 - 单击将我发送到锚点。在另一个按钮中,我将 window.location.hash 设置为“”(空字符串)-单击将我送回页面顶部。在这两种情况下,页面都没有从服务器刷新。所以,如果你把代码贴在你正在做的事情的地方,也许有人会发现问题。
              猜你喜欢
              • 2011-07-02
              • 2014-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-15
              • 1970-01-01
              相关资源
              最近更新 更多