通过卸载事件禁用BFcache(前后缓存)。

3

(注:仅适用于FireFox)

后退前进缓存是Firefox中的缓存系统,当单击“返回”按钮时运行。它将简单地使用先前页面中的DOM,而不是重新加载整个页面(和重新请求文件)。

我正在使用一个分析服务piwik,需要将跟踪代码片段添加到页脚。添加后,后退前进缓存不再起作用。

据我所知,如果有卸载事件(或beforeunload),则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

使用 unloadhandler

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); - A. Wolff
@roasted,这个问题与piwik无关,它只是一个添加卸载事件的工具示例。我不需要像你建议的那样再添加更多。我需要摆脱它们所有,否则BFCache将无法工作。我添加了另一个示例,请参见上面,我试图这样做,但它也不起作用。 - user429620
@roasted - 尝试了你的建议:http://users.telenet.be/prullen/bfcache/e.html - 但是 BFCache 似乎仍然无法正常工作。 :/ - user429620
@roasted;我尝试了一下- http://users.telenet.be/prullen/bfcache/f.html - 可惜还是没有成功。有什么区别吗?加载示例a.html,您会发现实际上有两个不同的警报。一个用于普通页面加载,另一个用于按返回按钮。到目前为止,它只在示例a中起作用。 - user429620
@roasted - 刚刚通过 browserstack.com 在 Win7 上测试了 FF22,它像我说的那样工作,有两个不同的警报(后退按钮或不使用后退按钮)。你可能加载了某些扩展,它们也会添加 unload 事件,这使得即使在提供的默认示例中也无法成功。 - user429620
显示剩余5条评论
1个回答

4
为了启用BFCache,您需要删除beforeunload事件侦听器。它应该是由Piwik代码添加的相同侦听器,否则removeEventListener将无效。
该侦听器在Piwik源代码之外不可访问,因此您不能简单地删除它。
但是,如果您有可能在Piwik之前插入代码,可以尝试覆盖addEventListener,跟踪添加的处理程序并公开功能以一次性删除所有跟踪的处理程序。

如果在导航发生之前清除处理程序,是否已知Firefox的“后退-前进”缓存和WebKit页面缓存将重新启用当前页面? - Mihail Malostanidis
1
@MihailMalostanidis 代码在导航时检查页面是否符合 BFCache 的条件,因此如果处理程序在那个时刻之前被清除,它们不会禁用缓存。类似的技术和代码示例也可以在这里找到:https://web.dev/i18n/en/bfcache/#always-close-open-connections-before-the-user-navigates-away - Victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接