在我的网站中,我有一个websocket连接,它会向服务器发送信息,以防访问者在x秒后空闲(不移动鼠标或按键)。一切都很正常,但我在Windows7(可能还有其他操作系统)上的谷歌chrome(版本37,现在是38,目前是最新的稳定版本)上看到了一个奇怪的行为。
访问者在页面加载之前(在点击进入地址栏之前)连接到websocket。挖掘问题我发现了这个http://readwrite.com/2012/01/05/new_chrome_will_load_web_pages_before_you_hit_ente
如果你在一个你一直访问的网站上输入地址自动完成后,Chrome将开始预渲染页面,减少加载时间。
更多关于谷歌博客上的即时页面http://chrome.blogspot.ro/2011/08/instant-pages-on-google-chrome.html
一切都很好,但有一个问题,假设我想访问该网站,在我输入网站名称的第三个键后,谷歌加载了页面,并与我的服务器建立了websocket连接,即使我没有点击回车键,即使我更改了地址栏中的文本,该连接也将持续数小时。
另一个问题是,当其他网站的名称与我的类似时。例如,我想访问cooldogs.com。我去地址栏开始输入cool,出现了两个网站coolcots.com和cooldoggs.com。因为coolcotscom是第一个网站,chrome会预加载该网站,连接到websocket,即使我想访问酷狗网注:coolcots.com和cooldogs.com是的发明名称
所以我的问题是,如何让谷歌铬连接到websocket服务器,只有在用户点击进入并加载网站后。我对谷歌chrome配置不感兴趣,因为我无法教育所有访问者更改设置。
这是bug还是设计流程?
如果页面可见,您可以尝试使用Visibility API来启动WS连接。
页面可见性API让您知道网页何时可见或在集中通过选项卡浏览给定的网页在后台,因此对用户不可见。
API通过提供当网页不可见。
用例
几个例子:
- 网站有一个图像转盘,不应前进到下一张幻灯片除非用户正在查看页面
- 显示信息面板不想轮询服务器以获取更新当页面不可见时
- 页面要检测其何时已预呈现,因此可以保持页面浏览量的准确计数
它可能类似于:
if(document.hidden === undefined || !document.hidden){
// start WS connection
}
document.addEventListener("visibilityChange", function(){
if( !webSocketStarted && (document.hidden !== undefined && !document.hidden){
// start WS connection
}
}, false);
读一下医生,试试看。