在 IE 中刷新 javascript location.hash

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2602260/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 01:05:51  来源:igfitidea点击:

javascript location.hash refreshing in IE

javascripthashinternet-explorerlocationreload

提问by aepheus

I need to modify the hash, remove it after certain processing takes place so that if the user refreshes they do not cause the process to run again.

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

This works fine in FF, but it seems that IE is reloading every time I try to change the hash. I think it is related to other things that are loading on the page, though I am not certain. I have an iframe that loads (related to the process) as well as some scripts that are still being fetched in the parent window.

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

I can't seem to figure out a good way to change the hash after all the loading completes. And, at the same time am not even positive that it is related to the loading.

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

Any ideas on how to solve this?

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

More odd behavior: The hash is coming from else where in the web app via a redirect. I have found if I simply add the hash by hand, adding #myid to the url, it does not reload. It does not matter if I enter the hash on a page that has already loaded (adding #myid to the already existing url) or by entering the complete url in a new tab.

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

回答by Jarne Cook

This appears to be a bug with Internet Explorer(tested with 7 and 8).

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

Changing window.location.hash should not result in a reload, and it is a common JavaScript technique to use the hash for maintaining state.

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

If you manuallyload a page and change the hash using JavaScript it will work.

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

The problem is when you are redirected to the pagefrom a different location (ie: using HTTP header "Location"), then modifying the hash will result in a reload.

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

To get around this bug you could:

要解决此错误,您可以:

1)If you can control the redirect, you could replace the Location header with some HTML.

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

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

2)if not, you could try reloading the page when it is loaded. To prevent a reload loop you may need to set a cookie.

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"

The obviously drawback is that loading the page results in two page request & render, so you'll would want the reload to be one of the first things the page does when it loads.

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

回答by rjmunro

@JarneCookseems to be right - it is a bug in IE.

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

You might be able to just do:

你也许可以这样做:

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

at the top of your page. In normal circumstances, this should be a no-op, but if the user is using IE and has arrived via a redirect, the page will reload before they even notice it has loaded.

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

回答by u339897

The problem is that "The hash is coming from else where in the web app via a redirect.". If you use javascript to redirect the url in the client like this:

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

location.href = 'test1.aspx#testhash'

it will be ok !

一切都会安好的 !

So this is the IE bug: When a web app via a redirect, the browser may only see the prev url, so when you modify the location.hash, the browser sees a url change, so refreshes the page.

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

回答by Dmitry

The similar issue existed in my project. But we could not use methods described above, because when IE refreshed a page, preloaded data was reset. So, we used the feature of the browser. When you click for 'a' tag, onClick event happened firstly and after event browser use 'href' attribute for redirecting. When IE use href with hash for redirecting, reloading do not exist. So, you can use onClick event for invoke server-side processing(__doPostBack for asp.net for example) and when the processing will be executed, browser will use 'href' attribute for redirecting. So, new page will not be reloaded. Also you can use window.location = yourNewLocationWithHashinvoking after server-side processing. I hope this help =)

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

回答by Rishabh

Was facing this issue, As suggested in one of the answers, the issue was only when a 302/301 redirection. Hash change does not reload if the page was not a redirect. I was redirecting using PHP and did not want to use a cookie to stop the redirection.

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

More over this issue was there in some IE9 browsers as well, tried 5 IE9 browsers, 4 reloaded the page.

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

Here is a fix added this in head section :

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

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

回答by jan.vdbergh

We had the same problem.

我们遇到了同样的问题。

In our case it consisted of a http URL which was redirected to https by Apache. Since the string after the hash sign is never passed to the server, it got lost.

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

回答by Eye

Here is a cross-browser solutions. Works in IE, Chrome, Safari, and FF (tried with latest versions).

这是一个跨浏览器的解决方案。适用于 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 ;

Basically, I leverage query ("?") string to trigger the page reload with hash. What the first line does is it checkes whether there is our "golden" query string (I use "c" variable which stands for "comment"). If there is,

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

  1. the new URL will have everything before that "c=";
  2. then adds our golden "c=" + a random number between 0 and 10 + "#" + my comment id to which the browser needs to jump when reloaded.
  1. 新 URL 将包含“c=”之前的所有内容;
  2. 然后添加我们的金色“c=”+ 0 到10 之间的随机数+“#”+ 我的评论ID,浏览器在重新加载时需要跳转到该ID。

If there is no,

如果没有,

  1. the new URL will have everything old URL used to have;
  2. if the old URL already contains some other query string (something after "?"), add a query append operator "&";
  3. if no "?", then add it;
  4. then goes the above mentioned "golden" query.
  1. 新 URL 将拥有旧 URL 的所有内容;
  2. 如果旧 URL 已经包含一些其他查询字符串(“?”之后的内容),请添加查询附加运算符“&”;
  3. 如果没有“?”,则添加它;
  4. 然后是上面提到的“黄金”查询。

The reason I add a random number after "?" is that after the first reload there is something like "?#comment-10". In this case, the next change to the URL will not reload the page, since browser understands it as an anchor jump instruction.

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

To force reload, we need to add some random thing to the query so that the new URL is different from the previous.

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

This solution will work on all browsers and will make sure the reload doesn't break the existing query. The only noteis to make sure your "golden" query variable name is unique.

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

Hope this helps.

希望这可以帮助。

回答by K.Rijpstra

If you use javascript to set the hash don't use a "#"

如果您使用 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

回答by Ray

It seems to me that if you change the hash, you are basically changing the location of the page, and so IE (or any browser) would reload. How are you trying to do this? window.location.hash = "";?

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

Maybe Firefox is just smart enough to see what you are doing and avoid the refresh.

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