【问题标题】:BFcache disabled by unload events (Back-Forward cache)BFcache 被卸载事件禁用(Back-Forward 缓存)
【发布时间】:2013-08-03 20:57:20
【问题描述】:

(注意:仅限 FireFox)

Back-Forward 缓存是 Firefox 中的一个缓存系统,在单击后退按钮时运行。然后它会简单地使用缓存中的前一个页面的 DOM,而不是重新加载整个页面(并重新请求文件)。

我正在使用 piwik(一种分析服务),它需要将跟踪代码 sn-p 添加到页脚。添加后,后向缓存不再起作用。

据我了解,如果有卸载事件(或卸载前),bfcache 会自动禁用。这可能就是这里发生的事情。

我可以添加什么来使 BFCache 正常工作吗?

更糟糕的是,我无法在 piwik 代码下方添加任何自定义代码。那个永远是最后一个。

我添加了下面显示的代码来尝试删除所有已注册的卸载事件,但 BFcache 仍然无法正常工作。

$(window).unbind('beforeunload');
$(window).unbind('unload');
window.onbeforeunload = null;
window.onunload = null;

我也试过了:

function UnloadHandler() { 
    window.removeEventListener('unload', UnloadHandler, false); 
}

window.addEventListener('unload', UnloadHandler, false);

$(window).unload(function () { $(window).unbind('unload'); });

但这也不起作用。

我在网上放了一些样品。请记住使用 Firefox 进行测试:

这个显示了一个正常工作的 BFcache(根据是否点击后退按钮,您会收到不同的警报)

http://users.telenet.be/prullen/bfcache/a.html

已加载 piwik,BFCache 不再工作

http://users.telenet.be/prullen/bfcache/b.html

已加载 piwik,尝试取消设置 onload 事件,但仍无法正常工作

http://users.telenet.be/prullen/bfcache/c.html

使用卸载处理程序

http://users.telenet.be/prullen/bfcache/d.html

@roasted 的建议

http://users.telenet.be/prullen/bfcache/e.html http://users.telenet.be/prullen/bfcache/f.html

更多关于 BFCache 的信息:

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

您可以在此处查看该行为的另一个演示:

http://www.twmagic.com/misc/cache.html

如果添加 dom 元素,然后单击第一个链接,则返回 - dom 元素仍然存在。但是,如果您添加了 onload 或 beforeunload 事件,则情况并非如此。再次,在 Firefox 中进行测试。

有什么想法吗?

【问题讨论】:

  • 我完全迷失了你正在尝试做的事情,因为我不知道你正在使用的工具/插件,但你不能改为捕获事件:window.addEventListener('unload', UnloadHandler, true); ???跨度>
  • @roasted 这个问题和 piwik 无关,它只是一个添加卸载事件的工具的例子。我不需要像你建议的那样添加更多。我需要摆脱所有这些,否则 BFCache 将无法工作。我添加了另一个示例,见上文,我试图这样做,但它也不起作用。
  • @roasted - 尝试了你的建议:users.telenet.be/prullen/bfcache/e.html - 但 BFCache 似乎仍然不起作用。 ://
  • 问题是我看不出与应该工作的页面和你告诉的页面不起作用的任何区别。你怎么能看出区别?单击链接然后单击浏览器的后退按钮?对我来说,所有页面都显示警报()。我在 FF 22.0
  • 正如我在 piwik 源代码中看到的,它使用的是 javascript,而不是 jquery 和 beforeunload 事件。我会说然后尝试:$(window).on('load',function(){this.onbeforeunload = null;}); 但这需要在触发窗口的 onload 事件之前设置来自 piwik 的 beforeunload 。试试看

标签: javascript jquery firefox caching browser-cache


【解决方案1】:

为了启用 BFCache,您需要移除 beforeunload 事件监听器。它应该是 Piwik 代码添加的同一个侦听器,否则 removeEventListener 将什么也不做。

该侦听器在 Piwik 源之外无法访问,因此不能简单地删除它。

但是,如果您有可能在 Piwik 之前插入代码,您可以尝试 override addEventListener,跟踪添加的处理程序并公开函数以立即删除所有跟踪的处理程序。

【讨论】:

  • 是否知道如果在导航发生之前清除了处理程序,Firefox Back-Forward 缓存和 WebKit Page Cache 将为当前页面重新启用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多