从iOS浏览器中的后向缓存中检索页面时始终触发的事件

时间:2017-03-21 07:23:24

标签: javascript ios safari

当我在移动设备(iOS 10.2.1)Safari或Chrome上使用后退按钮时:

  • 窗口的网页显示事件为fired only once建议:1234567
  • 窗口的popstate事件未被触发。 建议:123
  • 文件的readystatechange事件未被触发。 建议:1

为什么我需要这个?

我在点击时禁用了提交按钮,因此无法多次提交表单,但是当用户使用浏览器的后退按钮返回页面时,提交按钮会因为BFCache。

我需要在用户离开页面时或者当他们回来时触发的事件,以便我可以重新启用提交按钮。 unload事件永远不会被触发,只有在第一次触发pagehide和pageshow事件时才会触发:

  1. 我从第A页导航到第B页。
  2. 触发了一个Pagehide(不会触发卸载)。
  3. 我使用浏览器的后退按钮返回。
  4. 触发了网页显示(不会触发加载,popstate或readystatechange)。
  5. 我再次导航到B,这次A的页面隐藏不会被解雇。
  6. 我再次使用后退按钮返回,并且不会触发A的页面显示。
  7. 后续后退/前进触发我无法找到的任何事件。
  8. 一种解决方法是首先刷新页面:

    window.addEventListener('pageshow', function (e) {
        if (e.persisted) {
            window.location.reload();
        }
    }, false);
    

    但这违背了BFCache的全部要点。在没有重新加载整个页面的情况下使用浏览器的后退按钮时,是否没有可靠的方法来做某些工作?

2 个答案:

答案 0 :(得分:0)

这似乎是Webkit的一个已知错误: https://bugs.webkit.org/show_bug.cgi?id=156356

答案 1 :(得分:0)

我接受了morgoe的回答,因为由于他提到的错误而没有可靠的事件。

这是绝望的解决方法:
它通过使用用户代理嗅探来检测iOS浏览器,首先重新加载页面来禁用BF缓存。

window.addEventListener('pageshow', function (e) {
    e.persisted &&
    /iPad|iPhone|iPod/.test(navigator.userAgent) &&
    !window.MSStream &&
    window.location.reload();
}, false);