在IE中刷新javascript location.hash

时间:2010-04-08 17:53:43

标签: javascript hash internet-explorer location reload

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

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

在所有加载完成后,我似乎无法找到更改哈希的好方法。并且,与此同时,它甚至不是积极的,它与装载有关。

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

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

9 个答案:

答案 0 :(得分:17)

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

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

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

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

要解决此错误,您可以:

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"

明显的缺点是加载页面导致两页请求&amp;渲染,所以你会希望重新加载是页面在加载时所做的第一件事。

答案 1 :(得分:14)

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

您可以这样做:

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

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

答案 2 :(得分:10)

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

location.href = 'test1.aspx#testhash'

没关系!

所以这是IE的错误:当通过重定向的Web应用程序时,浏览器可能只能看到prev url,因此当您修改location.hash时,浏览器会看到URL更改,因此刷新页面。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

正面临这个问题,正如其中一个答案中所建议的那样,问题仅在于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]-->

答案 5 :(得分: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. 新网址将包含“c =”;
  2. 之前的所有内容
  3. 然后添加我们的黄金“c =”+ 0到10之间的随机数+“#”+我的评论ID,浏览器在重新加载时需要跳转。
  4. 如果没有,

    1. 新网址将包含旧网址的所有内容;
    2. 如果旧网址已包含其他一些查询字符串(在“?”之后),请添加查询追加运算符“&amp;”;
    3. 如果没有“?”,则添加;
    4. 然后进行上述“黄金”查询。
    5. 我在“?”之后添加随机数的原因是在第一次重装之后有类似“?#comment-10”的东西。在这种情况下,对URL的下一次更改将不会重新加载页面,因为浏览器将其理解为锚定跳转指令。

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

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

      希望这有帮助。

答案 6 :(得分:0)

我们遇到了同样的问题。

在我们的案例中,它由一个http URL组成,该URL被Apache重定向到https。由于哈希符号之后的字符串永远不会传递给服务器,因此它丢失了。

答案 7 :(得分:-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

答案 8 :(得分:-5)

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

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