Internet Explorer 11后退按钮Javascript行为

Internet Explorer 11后退按钮Javascript行为,javascript,jquery,internet-explorer,internet-explorer-11,Javascript,Jquery,Internet Explorer,Internet Explorer 11,在Chrome、FF和IE8-10中,当我按下后退按钮时,会调用javascript$(document).ready()函数,但在IE11中,不会调用任何javascript。有人知道如何让IE11像所有其他浏览器一样响应并使我的代码保持一致吗 <script type="text/javascript"> alert("Are we called?"); // neither is this called in IE11 $( document ).re

在Chrome、FF和IE8-10中,当我按下后退按钮时,会调用javascript$(document).ready()函数,但在IE11中,不会调用任何javascript。有人知道如何让IE11像所有其他浏览器一样响应并使我的代码保持一致吗

<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缓存页面上的所有内容,包括javascript状态,因此不会触发任何常见事件。当通过后退/前进按钮在页面之间来回切换时,javascript代码只会恢复状态,而不会收到中断通知。我觉得这对开发人员有点粗鲁,或者可能会触发一个事件,但我当然不知道

无论如何,您可以在上看到这种行为。请注意,在IE11中,您导航到google.com,然后按back,所有球都在同一个精确位置,并且一切都继续工作。在其他浏览器中,页面会重新初始化,球会再次从天花板上落下。我可以看到IE11行为将是有用和有益的场景,但我只希望Microsoft能在您不希望这样的情况下提供文档。另外,如果默认设置与其他浏览器一样,并使此功能成为可选功能,而不是破坏与所有内容的兼容性,包括它自己的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>

var dumbIEHistory=history.length;
函数busyWaitCheckForHistoryChange(){
if(history.length!=dumbIEHistory){
警报(“历史记录已更改,按了后退/前进,运行我的功能!”);
myFunction();
dumbIEHistory=history.length;
}
}
//使用http://www.pinlady.net/PluginDetect/Browsers/ 进行浏览器检测
$(窗口)。加载(函数(){
如果(browser.isIE&&browser.verIE>=11){
//让我们不要因为IE11的愚蠢而让所有其他浏览器陷入困境
setInterval(“busyWaitCheckForHistoryChange()”,1000);
}否则{
//在其他浏览器中,按下“后退/前进”时将调用此选项
myFunction();
}
});

当按下后退/前进按钮时,我所做的就是捕捉,因为在我们回击后,历史长度将为+1。如果用户来回导航过快,则在调用函数之前可能会有一瞬间,如果这是一个问题,则可以缩短间隔。希望这对其他人有所帮助。

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

var isInited = false;

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

    ...
}

$(document).ready(init);

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

我对这个问题也同样感到恼火。为什么IE如此不同

我发现在HTML文件中设置
缓存控制:no Cache
没有帮助。帮助的是在响应标题中实际设置它

在我的例子中,我正在绘制一个谷歌图表,每当我访问页面时,我都需要它来重新绘制(当我手动刷新页面时,IE11甚至阻止了我的图表重新绘制!)

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

Response.CacheControl = "no-cache";

希望这能有所帮助。

它被称为BF缓存,自FF 1.5以来一直存在

绑定到
pageshow
事件和
事件。持久化的
将告诉您它是否从缓存中提供


我也遇到了这个问题,如果你阅读IE文档,这显然不是一个bug。正如罗伯特·戴利(Robert Daly)所写,看看 您可以在此文档中找到
beforeunload
事件阻止BF缓存。下面是一段简短的代码,它定义了在控制台上写入此事件以防止BF缓存:

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

onhashchange仅监视url之后的更改,例如。如果完全更改页面,则不会触发onhashchange。因此,onhashchange检测到,但当被回击并转到例如时,它不会被激发。请尝试此操作,当您在站点A上,然后转到站点B时,它可能会修复该问题,在返回站点A后,再转到站点B,历史长度不会更改,因此您的脚本在此类场景中是无用的。IE不执行任何脚本,只是默默地加载DOM的最新状态。好的一点是,我的场景并不真正关心导航离开,只是返回。谢谢你的赏金,我也想得到一个更好更满意的答案!这不仅仅是烦人的,而且只是IE失败的另一个新原因。我无法在Win7下的IE11.0.9600.17105上重现这个问题。当返回到页面时,准备好处理程序fired@A.Wolff-确保在测试此问题时关闭了开发人员工具控制台!如果它是打开的,一切都像其他浏览器一样工作。若控制台关闭了,那个么缓存问题就会比比皆是。我不知道为什么罗伯特·戴利的回答被否决了两次。它包含了一些有用的信息,说明了IE11在按下后退键时的行为方式。从msdn文档(又名第二个链接)中,我们读到:“为了缓存网页,网页必须满足以下条件:[……]F12开发者工具窗口未打开”附录:一个稍微有趣的消息是,如果在客户端注册表中将TabProcGrowth设置为0,则会出现IE11(基于我的测试)不再使用有问题的机制缓存页面。如果这确实成立,那么这是未记录的行为(AFAIK),所以如果我错了,请随时纠正我。第一个链接没有帮助,我从来没有注意到有第二个链接,因为格式。。看起来非常有希望。。。不幸的是,我不再从事需要这项工作的项目
if (typeof window.onbeforeunload != 'undefined'){
   function doNothing(){
      console.log('Prevent BF Cache');
   }
   window.onbeforeunload = doNothing;
}