24

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

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

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

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

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

4

9 回答 9

18

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

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

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

问题是当您被重定向到页面时时,修改哈希将导致重新加载。

要解决此错误,您可以:

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"

明显的缺点是加载页面会导致两个页面请求和渲染,因此您会希望重新加载成为页面加载时首先要做的事情之一。

于 2010-07-20T01:43:57.443 回答
14

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

您也许可以这样做:

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

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

于 2010-09-27T14:14:12.183 回答
10

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

location.href = 'test1.aspx#testhash'

会没事的 !

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

于 2010-05-13T02:33:04.307 回答
1

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

于 2011-02-04T12:21:25.703 回答
1

正面临这个问题,正如其中一个答案所建议的那样,问题仅在 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]-->
于 2013-01-07T12:24:05.283 回答
0

这是一个跨浏览器的解决方案。适用于 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. 然后添加我们的金色 "c=" + 0 到 10 之间的随机数 + "#" + 我的评论 ID,浏览器在重新加载时需要跳转到该 ID。

如果没有,

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

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

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

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

希望这可以帮助。

于 2012-01-19T03:50:56.537 回答
0

我们遇到了同样的问题。

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

于 2014-05-07T12:19:41.757 回答
-3

如果您使用 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
于 2010-05-31T09:34:06.287 回答
-5

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

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

于 2010-04-08T18:08:09.987 回答