Chrome预呈现功能会导致交互式页面出现问题

时间:2012-10-30 22:46:22

标签: javascript google-chrome websocket

对于较新的Google Chrome浏览器,即版本17+(不确定其他浏览器是否也这样做),默认情况下似乎启用了预渲染功能(请参阅http://support.google.com/chrome/bin/answer.py?hl=en&answer=1385029),这意味着即使在用户完成在地址栏中输入网址之前,页面仍在加载!

我想对于主要是静态内容的页面来说这是一个很好的技巧,它会欺骗用户通过有效加载它来加快页面加载速度。但是,对于在加载时触发某些操作/逻辑的页面,这会产生问题。

例如,考虑一个与服务器建立websocket连接的页面,并在加载后立即发送一个msg。当用户输入此页面的URL时,可能已经建立了连接并发送了msg,但是当用户实际按下地址栏中的“enter”时,websocket连接将丢失并重新建立再次,msg被重新发送,可能是因为websocket将实际的页面加载视为刷新。现在,如果您有一些响应断开连接或接收某些消息的逻辑,这可能会导致服务器端的混乱行为。另一个例子可能是重定向,在这种情况下可能会发生双重定向,因为页面被有效加载了两次。

是否有任何有效的方法来处理这个浏览器功能,除了关闭它,这是开发人员无法控制的?一些JavaScript技巧?

2 个答案:

答案 0 :(得分:1)

请参阅 https://developers.google.com/chrome/whitepapers/pagevisibility

使用document.webkitVisibilityState检查它是否为“prerender”状态。 如果websocket处于“预呈现”状态,请不要连接它。

希望这会有所帮助。 振作!

答案 1 :(得分:0)

仅供参考,我遇到了这个问题并使用了可见性状态来跳过套接字连接但是从51.0.2704.103开始,突然我的页面在第一次加载时开始呈现白色。事实证明,他们修复了它,以便预呈现将您的Web套接字连接保持到呈现的页面,但它不会重新运行您的代码;因此,如果您保留该代码,您最终将无法使用网络套接字或奇怪的错误或白页。有点乱,但是现在我把预渲染检查恢复了,它似乎又恢复了。