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的有限知识更为熟悉。