3

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

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

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

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

4

2 回答 2

1

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

使用 document.webkitVisibilityState 检查它是否处于“预渲染”状态。如果 websocket 处于“预渲染”状态,则不要连接它。

希望这可以帮助。欢呼!

于 2012-12-25T09:47:28.480 回答
0

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

于 2016-06-24T00:12:54.467 回答