2014-02-07 39 views
2

我正在Node.js中构建一个Web应用程序,并使用Socket.IO来处理我的客户端和服务器端之间的数据传输。使Socket.IO显示浏览器的页面加载指示器(旋转轮)

我的web应用程序的核心部分是内容提要。我的客户端JavaScript为新闻源的内容发出Socket.IO调用。一旦响应从服务器返回,它会使用JQuery在网页上填充订阅源。

我的问题是,Socket.IO不会导致浏览器的页面加载指示器(对于Chrome浏览器,这是网页标签中的一个旋转轮)显示。我想让它表现出来。如果没有这个加载指示器,我的网页看起来像是在加载完成时(实际上还没有填充)。

这个问题的解决方案是什么?先谢谢你!

+0

你可以提供你的客户端代码为socket.io有问题吗? – hiteshtr

+0

只是这个:socket.emit(“getRequests”,this.info);.而已。我的问题不是套接字代码不起作用。这就是浏览器的页面加载指示器(旋转轮)在前端等待响应时不会出现。 – ryzh

+0

正确的解决方案是使用定制的旋转轮。例如,在您的页面上放置一个动画GIF,并在您接收数据时执行“.emit”并隐藏它时显示它。这就是FaceBook的工作原理。当你点击一个菜单项时,一个小的旋转轮会出现在它旁边。 – freakish

回答

2

本身没有正确答案:浏览器供应商对于某些活动为什么会显示“加载”状态有不同的理由:A good rundown here

一般来说,类似于ajax的请求(与实际整页加载异步的东西)应该不会显示默认的加载指示器,因为忙碌状态向用户指出浏览器慢/繁忙,并且我们对所有用户使用ajax请求各种背景任务。当然,有些时候开发人员会想要显示这些指标(表单提交,通过ajax下载后续页面的单页应用程序:我们希望向用户传达重大事件发生的时间,以及他们应该等待它完成),但我们没有太多的控制权来强制在异步请求时发生这种情况。在某些浏览器上“伪装”它的唯一真正方法是在iframe中加载内容:在这种情况下,一些现代浏览器确实会触发“繁忙”状态。

使用Websockets,大多数供应商可能相当合理地将ajax请求应用于相同的逻辑:有很多操作您希望对websockets执行操作,而不需要用户直接启动它们,因此它们不应该引发那种“浏览器认真忙,持有一秒钟”的感觉。而且,就像ajax一样,我很难理解这个设计决定。

iframe解决方案是有限的:它适用于某些浏览器,但并非全部(特别是,它在所有主流移动浏览器中都被忽略)。并且粗暴地做(即创建一个隐藏的iframe,当你想让它触发负载指示器并在你想取消它时删除它)有成本:你基本上需要击中一个旨在“失速”的资源(比如PHP页面只运行睡眠(10000),并保持连接打开)。这两个都很重要(额外的http请求只是为了触发一个效果),并且还将一些服务器与保持打开的连接关联起来,这些连接基本上没有做任何事情。这可能不会扩展,特别是如果该服务器与托管应用程序的服务器相同。

你可能反而停留在编写一个自定义加载指示器(微调,虚假的进度条固定在屏幕顶部)。这并不令人满意,但它是唯一保证与用户交流的东西。我有一个jQuery的ajax解决方案,它利用了iframe方法(Noisy JSON),你可以将它作为socket.io的插件再现,但是如果你使用websockets,那基本上意味着回到ajax风格的请求通信。而且在Safari,移动设备和更新的IE浏览器上,你仍然不太顺利。

相关问题