jquery / javascript setInterval

目前我正在开发用户通知警报消息function。

我设法使用setInterval来控制我的Ajax调用(检查用户是否有任何通知消息)。 但我的问题是我只希望通知消息只出现在页面上一次(现在它在屏幕上显示多个通知警报消息)。 我知道你可以使用setTimeout使它只调用一次但我还需要页面检查是否每5分钟有一个新的通知消息警报。

第二个问题是第一轮可能会立即调用Ajax,然后每5分钟调用一次所有其他调用吗? 因为我希望系统在他们登录系统后立即检查n然后每5分钟一次。

这是我的代码

 function getAjaxNotice() { $.post("/async/getnotification", {}, function(response) { var notice = $(response); $("#notices").prepend(notice); }); return false; } setInterval("getAjaxNotice()", 50000); 

首先,您应该将初始化代码包装在onLoad函数中:

 $(document).ready(function() { // Put all your code here }); 

让它出现一次很简单,使用.html()代替设置内容而不是添加内容:

 $("#notices").html(notice); 

第三,作为样式注释,您不应该将字符串传递给setInterval()。 相反,传递一个函数名称:

 setInterval( getAjaxNotice, 50000 ); 

最后,让它现在调用函数,并在每5分钟后再次调用,使用:

 // Set the timer setInterval( getAjaxNotice, 50000 ); // Call it once now getAjaxNotice(); 

另请注意,50000是50秒,而不是5分钟。 5分钟将是5 * 60 * 1000 = 300000。

对于第一个问题,您应该存储setInterval的返回值,然后在收到警报时调用clearInterval(myIntervalId)

对于第二个问题,您可以在正文getAjaxNotice期间调用getAjaxNotice一次,如果没有收到警报,则在该点调用setInterval

setInterval的时间以毫秒为单位。

 5 minutes * 60 seconds * 1000 milliseconds = 300000ms 

另外,我建议你将一个函数传递给setInterval而不是一个字符串,这样就可以避免隐式使用eval

 setInterval(getAjaxNotice, 300000); 

要在页面开头调用getAjaxNotice ,请将其放在ready块中。

 $(function(){ getAjaxNotice(); }); 

有几件事……

 setInterval("getAjaxNotice()", 50000); 

不是5分钟。

5分钟= 300000毫秒。

如果你想让它立即运行,那么你每5分钟就可以做到这一点

 $(document).ready(function() { getAjaxNotice(); function getAjaxNotice() { $.post("/async/getnotification" , {}, function(response) { var notice = $(response); $("#notices").prepend(notice); }); return false; } setInterval( getAjaxNotice(), 300000 ); }); 

在你的情况下,听起来你正在处理一些问题。 因此,使用您当前的方法,您可以最初进行ajax调用并使用设置超时进行跟踪:

 getAjaxNotice(); setTimeout( "getAjaxNotice()", 300000); 

其次,如果您有某种类型的“消息确认”事件,则可以轻松确保用户只收到一次消息。 假设您的用户可以在多台计算机上打开浏览器,如果您让用户单击消息或单击确定按钮,或执行某些操作以确认他们收到消息,您可以启动另一个ajax调用以从缓冲区中删除该消息在您的服务器上,但仍然在所有打开的浏览器上显示它。 本地浏览器只会显示一次,因为如果邮件是重复的(根据对您的应用程序有意义的标准),您可以阻止在客户端显示它

但是,您应该查看长轮询和COMET, http://en.wikipedia.org/wiki/Comet_ (programming) 。 Comet是一个基于服务器端事件向Web浏览器推送通知的概念,而不是Web浏览器经常要求服务器进行更改。

由于Web框架和浏览器的限制,这是通过一些技术实现的,但长轮询似乎是最普遍的。 HTML5和websockets正在尝试进行一些可能阻止轮询的更改,但它尚不可用。

Long Polling, http://en.wikipedia.org/wiki/Push_technology和基于COMET的架构已被meebo和facebook等公司使用。 不要引用我这个,但由于某种原因,我倾向于相信facebook使用基于Erlang的网络服务器来提供他们的聊天消息。 Erlang和NodeJs只是一些解决方案,您可以使用这些解决方案来构建轻量级Web服务器,这些服务器可以很好地满足您的服务器上的大量长轮询请求。

你应该自己阅读所有这些内容,因为有大量的信息可供选择。 我已经尝试在Amazon EC2上创建一个NodeJs服务器,因为我传统上是一个.NET工作,并且不觉得IIS是支持使用长轮询的.net应用程序的长轮询function的正确解决方案,而我不得不说我喜欢NodeJs。 另外,javascript语言比我对Erlang的有限知识更为熟悉。