在IE中刷新javascript位置
我需要修改散列,在发生特定处理后将其删除,以便在用户刷新时不会导致进程再次运行。
这在FF中正常工作,但似乎每次我尝试更改哈希重新加载IE。 我认为这与网页上加载的其他内容有关,但我不确定。 我有一个加载的iframe(与进程相关)以及一些仍在父窗口中获取的脚本。
我似乎无法find一个好的方法来改变所有加载完成后的散列。 而且,与此同时,我们甚至都不认为这与装载有关。
任何想法如何解决这个问题?
更奇怪的行为:哈希是通过redirect在web应用程序的其他地方。 我发现,如果我只是手动添加散列,将#myid添加到URL,它不会重新加载。 如果我在已经加载的页面上input散列(将#myid添加到已经存在的URL),或者在新标签中input完整的URL,则无关紧要。
这似乎是与Internet Explorer (7和8testing)的一个错误 。
更改window.location.hash不应该导致重新加载,并且使用散列来维护状态是一种常见的JavaScript技术。
如果你手动加载一个页面,并使用JavaScript更改散列,它将起作用。
问题是,当你从一个不同的位置redirect到页面 (即:使用HTTP头“位置”),然后修改哈希将导致重新加载。
为了解决这个问题,你可以:
1)如果你可以控制redirect,你可以用一些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"
明显的缺点是加载页面导致两个页面请求和渲染,所以你会希望重新加载是页面加载时的第一件事情之一。
@JarneCook似乎是正确的 – 这是在IE中的错误。
你也许可以做到:
<script type="text/javascript"> window.location.hash = window.location.hash; </script>
在您的页面的顶部。 在正常情况下,这应该是一个无操作,但如果用户使用IE并通过redirect到达,页面将重新加载之前,他们甚至发现它已经加载。
问题是,“ 哈希是通过redirect在web应用程序的其他地方来的。 ” 如果您使用JavaScript来redirect客户端中的URL,如下所示:
location.href = 'test1.aspx#testhash'
一切都会安好的 !
所以这就是IE的bug:当一个web应用通过redirect的时候,浏览器可能只能看到prev url,所以当你修改location.hash
,浏览器会看到url的变化,所以刷新页面。
我的项目中存在类似的问题。 但是我们不能使用上面描述的方法,因为当IE刷新页面时,预加载的数据被重置。 所以,我们使用了浏览器的function。 当您点击“a”标记时,onClick事件首先发生,事件浏览器使用“href”属性redirect。 当IE浏览器使用HREF与哈希redirect,重新加载不存在。 因此,您可以使用onClick事件来调用服务器端处理(例如,__ doPostBack for asp.net),当执行处理时,浏览器将使用“href”属性进行redirect。 所以,新的页面将不会被重新加载。 您也可以在服务器端处理后使用window.location = yourNewLocationWithHash
调用。 我希望这个帮助=)
正在面对这个问题,正如其中一个答案所暗示的,这个问题只是在302/301redirect的时候。 如果页面不是redirect,则哈希更改不会重新加载。 我使用PHPredirect,并不想使用cookie来停止redirect。
在这个问题上还有一些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]-->
这里是一个跨浏览器的解决scheme。 适用于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 ;
基本上,我利用查询(“?”)string触发页面重新加载哈希。 第一行做的是检查是否有我们的“黄金”查询string(我用“c”variables代表“注释”)。 如果有,
- 新的url将会包含之前的所有内容“c =”;
- 然后添加我们的黄金“c =”+一个0到10之间的随机数+“#”+我的注释ID,浏览器在重新加载时需要跳转到该注释ID。
如果没有,
- 新的URL将具有旧URL的所有内容;
- 如果旧的URL已经包含了一些其他的查询string(“?”之后的东西),添加一个查询追加运算符“&”;
- 如果没有“?”,则添加它;
- 然后去上面提到的“黄金”查询。
我之所以在“?”后添加一个随机数 是在第一次重新加载之后,有一些像“?#comment-10”。 在这种情况下,URL的下一个改变将不会重新加载页面,因为浏览器将其理解为锚点跳转指令。
为了强制重新加载,我们需要在查询中添加一些随机的东西,以便新的URL与之前的不同。
此解决scheme将在所有浏览器上工作,并确保重新加载不会中断现有的查询。 唯一的注意事项是确保您的“黄金”查询variables名称是唯一的。
希望这可以帮助。
我们有同样的问题。
在我们的例子中,它由一个被Apacheredirect到https的http URL组成。 由于散列符号之后的string永远不会传递给服务器,因此会丢失。
如果你使用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
在我看来,如果你改变散列,你基本上是改变页面的位置,所以IE(或任何浏览器)将重新加载。 你打算怎么做? window.location.hash = "";
?
也许Firefox足够聪明,看看你在做什么,并避免刷新。