我需要修改哈希值,在进行某些处理后将其删除,这样如果用户刷新,则不会导致进程再次运行。
这在FF中工作正常,但似乎IE每次尝试更改哈希时都会重新加载。我认为它与页面上加载的其他内容有关,但我不确定。我有一个iframe加载(与进程相关)以及一些仍在父窗口中提取的脚本。
在所有加载完成后,我似乎无法找到更改哈希的好方法。并且,与此同时,它甚至不是积极的,它与装载有关。
关于如何解决这个问题的任何想法?
更奇怪的行为: 哈希来自其他位置,通过重定向在Web应用程序中。我发现如果我只是手动添加哈希,将#myid添加到url,它不会重新加载。如果我在已加载的页面上输入哈希值(将#myid添加到已存在的URL)或在新选项卡中输入完整的URL,则无关紧要。
答案 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”变量代表“注释”)。如果有,
如果没有,
我在“?”之后添加随机数的原因是在第一次重装之后有类似“?#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非常聪明,可以看到你在做什么并避免刷新。