2014-01-22 77 views
14

在Chrome,FF和IE8-10中,当我按下后退按钮时,我的javascript $(document).ready()函数被调用,但在IE11中,没有一个是调用。有谁知道如何让IE11像所有其他浏览器一样响应,并为我的代码带来一致性?Internet Explorer 11后退按钮Javascript行为

<script type="text/javascript"> 

    alert("Are we called?"); // neither is this called in IE11 
     $(document).ready(function() { 
      alert("document ready"); // does not get fired after hitting back on IE11 
     }); 
</script> 

有关IE11的恼人的问题是,如果你打开的开发工具,并开始试图跟踪或调试的问题,它消失了,它表现为IE10和回去后调用。就绪()。

我确实已通过此标头在此页面上禁用缓存,并且它还适用于我期望支持的所有其他浏览器(IE8-10,FF和Chrome)。

Cache-Control: no-cache 
+2

这不仅仅是令人讨厌的事情,而是IE浏览器打击的另一个新原因。 – KingOfHypocrites

+0

我无法在Win7下的IE 11.0.9600.17105上重现此问题。当回到页面时,就绪处理程序被触发 –

+0

@A。 Wolff - 确保在测试此问题时关闭了开发者工具控制台!如果它是开放的,一切和其他浏览器一样。如果控制台关闭,则缓存问题比比皆是。 – Ryan

回答

9

好吧,在冲击过去2小时的问题后,这是我的发现。

下列事件不会被调用之间向后和向前:

IE11缓存页面上的所有内容,包括JavaScript的状态,没有一个通常的e通风口被解雇。当通过后退/前进按钮在页面之间来回切换时,JavaScript代码只是恢复状态而不会被通知它被中断。 Sorta对开发者不尊重,或者可能会触发这个事件,但我当然不知道。

无论如何,你可以在this page full of balls上看到此行为。请注意,在IE11中,您导航至google.com,然后向后按,所有球都位于​​相同的确切位置,并且所有内容都可以继续使用。在其他任何浏览器中,页面都会重新初始化,并且球从天花板上再次下落。我可以看到IE11行为将会有用且有益的情景,但我只希望微软能够在您不需要时提供文档。此外,如果默认设置与其他浏览器一样,并且使此功能可选,而不是与所有设备兼容,包括其自己的IE9和IE10,那将会很不错!因此,我意识到如果我启动了一个计时器,它只会从我离开的地方开始。我不喜欢这个代码,因为它是一个忙碌的等待黑客,但它做我想要的。这将是巨大的,如果有人能想到更好的东西是不会这么忙......

<!-- IE11 back/forward hack - http://stackoverflow.com/questions/21274085/internet-explorer-11-back-button-javascript-behavior --> 
<script type="text/javascript"> 
    var dumbIEHistory=history.length; 
    function busyWaitCheckForHistoryChange() { 
     if (history.length != dumbIEHistory) { 
      alert("History has changed, back/forward has been pressed, run my function!"); 
      myFunction(); 
      dumbIEHistory=history.length; 
     } 
    } 

// using http://www.pinlady.net/PluginDetect/Browsers/ to do browser detection 
    $(window).load(function() { 
     if (browser.isIE && browser.verIE >= 11) { 
      // let's not bog down all the other browsers because of IE11 stupidity 
      window.setInterval("busyWaitCheckForHistoryChange()", 1000); 
     } else { 
      // in other browsers, this will be called when back/forward is pressed 
      myFunction(); 
     } 
    }); 
</script> 

Works的我在做什么按下后退/前进按钮时赶上因为历史长度在我们回击之后变成+1。如果用户来回导航的速度太快,则可能在调用该函数之前有一秒钟的时间,如果这是一个问题,则可以缩短间隔。希望这有助于他人。

+0

也试试这个,它可能会解决这个问题http://stackoverflow.com/a/20422240/2089963 – Syed

+0

当你在现场** A **,然后你去你身边** B **,返回后到网站** A **,然后前往您的网站** B **,历史长度不会改变,因此您的脚本对这种情况无用。 IE不执行任何脚本,只是默默地加载DOM的最后一个知道状态。 –

+0

好点,我的场景并不是真的关心离开,只有回来。感谢赏金,我想获得更好的更满意的答案! – PressingOnAlways

-2

您可以使用window.onhashchange监视后退/前进按钮的行为。

var isInited = false; 

function init() { 
    if (isInited) { 
     return; 
    } 
    isInited = true; 

    ... 
} 

$(document).ready(init); 

window.onhashchange = function() { 
    $(document).ready(init); 
}; 
+0

onhashchange仅监视url后的更改,例如http://example.com/whatever#hashChange。如果您完全更改页面,则不会触发onhashchange。因此,onhashchange将http://example.com/whatever#hashChange检测为http://example.com/whatever#changed,但是当http://example.com/whatever被回击并转到例如http://example.com。 – PressingOnAlways

-2

我对这个问题同样恼火。为什么IE如此令人沮丧地与众不同?

我发现在HTML文件中设置Cache-Control: no-cache没有帮助。什么帮助实际上是在响应头文件中设置的。

在我的情况下,我正在绘制一个Google图表,当我访问该页面时我需要重绘它(当我手动刷新页面时,IE11甚​​至阻止重绘我的图表)。

我正在使用ASP.NET MVC,并在我的操作方法中的这段代码解决了这个问题。

Response.CacheControl = "no-cache"; 

希望这会有所帮助。

6

这就是所谓的BF缓存,它已经出现自FF 1.5

绑定到pageshow事件和event.persisted会告诉你,如果从缓存中提供。

http://msdn.microsoft.com/library/ie/dn265017(v=vs.85).aspx

https://developer.mozilla.org/en-US/docs/Using_Firefox_1.5_caching

+1

我不知道为什么罗伯特达利的这个回应是两次投票。它包含有用的信息,说明为什么IE11在按回时表现得如此。从msdn文档(又名第二个链接)我们阅读: “为了被缓存,网页必须符合以下条件:[...] F12开发人员工具窗口未打开” – xDisruptor

+0

附录:一个有点有趣的如果TabProcGrowth在客户端的注册表中设置为0,那么IE11 *会出现*(基于我的测试),不再使用相关机制缓存页面。如果这确实成立,那么它是无证行为(AFAIK),所以如果我错了,随时纠正我。 – xDisruptor

+0

+1为好的答案。也不知道为什么downvoted – Pinoniq

5

我也遇到过这个问题,如果你读IE文件,这显然不是一个错误。正如Robert Daly所写的,看看http://msdn.microsoft.com/library/ie/dn265017(v=vs.85).aspx 你可以在这个文档上找到beforeunload事件防止BF缓存。所以这里有一段简短的和平代码,它定义了这个事件在控制台上写入以防止BF缓存:

if (typeof window.onbeforeunload != 'undefined'){ 
    function doNothing(){ 
     console.log('Prevent BF Cache'); 
    } 
    window.onbeforeunload = doNothing; 
} 
+0

这对我而言完全适用于IE11。 –

+0

这是IE 11中唯一的解决方案 – Bukashk0zzz