在@ IPad上的Safari上按"后退"按钮时,不会收到"pageshow"

Bre*_*eak 12 javascript safari jquery mobile-safari

我有以下处理程序:

        $(window).bind('pageshow', function() { alert("back to page"); });
Run Code Online (Sandbox Code Playgroud)

当我离开页面(通过按下链接)并返回页面(通过按"后退"按钮)时,不会调用alert()(IPad 2,iOS 5.1).

我做错了什么?我需要绑定的任何其他事件?

PS:有趣的是,在离开页面时正确接收了Pagehide.

Mik*_*ola 9

您可以查看活动的persisted属性pageshow.初始页面加载时设置为false.从缓存加载页面时,它设置为true.

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("back to page");
    }
};
Run Code Online (Sandbox Code Playgroud)

出于某种原因,jQuery在事件中没有此属性.你可以从原始活动中找到它.

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
      alert("back to page");
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 看起来这应该是正确答案,但我尝试过的浏览器(Mac OS 10.9上的Safari 7和Firefox 26)从未设置为持久化为真,即使它们实际上并未从服务器重新加载.(此时我甚至不愿意相信他们自己的开发人员工具,所以我使用Wireshark进行验证.我发送缓存控制头以使页面不可缓存,而Safari声称它不使用缓存,但当我单击Back时,Wireshark显示没有流量到服务器.) (3认同)
  • 看起来onpageshow事件根本不会触发6.1.1.点击后退按钮时...... (2认同)

Bra*_*one 7

这可能是一个缓存问题.当您通过"后退"按钮返回页面时,页面将从缓存中拉出(行为取决于浏览器).因此,您的JS将不会触发,因为页面已经在缓存中呈现,并且重新运行js可能对布局等有害.

您应该能够通过在响应中调整缓存标头或使用一些浏览器技巧来克服这个问题.

以下是该问题的一些链接:

编辑

这些都来自以上链接:

  • history.navigationMode = 'compatible';
  • <body onunload=""><!-- This does the trick -->
  • "Firefox 1.5+和Safari的下一个版本(包含bug 28758的修复程序)支持称为pageshow和的特殊事件pagehide."
  • 使用jQuery $(document).ready(handler)
  • window.onunload = function(){};


Mat*_*hew 5

你在那里做的是绑定alert("back to page")作为回调的返回值.那不行.你需要绑定一个函数:

$(window).bind('pageshow', function() { alert("back to page"); });
Run Code Online (Sandbox Code Playgroud)