jquery/javascript setInterval
目前,我正在开发一个用户通知警报消息功能 我设法使用jquery/javascript setInterval,javascript,jquery,Javascript,Jquery,目前,我正在开发一个用户通知警报消息功能 我设法使用setInterval来控制我的Ajax调用(检查是否有任何针对用户的通知消息)。但我的问题是,我只想要通知消息 在页面上出现一次(现在在屏幕上显示多个通知警报消息)。我知道您可以使用setTimeout使其只调用一次,但我还需要该页面检查每5分钟是否有新的通知消息警报 第二个问题是否可能是第一轮立即调用Ajax调用,然后每隔5分钟调用所有其他调用?因为我想让系统在他们登录system n后立即检查,然后每5分钟检查一次 这是我的密码 func
setInterval
来控制我的Ajax调用(检查是否有任何针对用户的通知消息)。但我的问题是,我只想要通知消息
在页面上出现一次(现在在屏幕上显示多个通知警报消息)。我知道您可以使用setTimeout
使其只调用一次,但我还需要该页面检查每5分钟是否有新的通知消息警报
第二个问题是否可能是第一轮立即调用Ajax调用,然后每隔5分钟调用所有其他调用?因为我想让系统在他们登录system n后立即检查,然后每5分钟检查一次
这是我的密码
function getAjaxNotice() {
$.post("/async/getnotification", {},
function(response) {
var notice = $(response);
$("#notices").prepend(notice);
});
return false;
}
setInterval("getAjaxNotice()", 50000);
有几件事
setInterval("getAjaxNotice()", 50000);
不是5分钟
5分钟=300000毫秒
5 minutes * 60 seconds * 1000 milliseconds = 300000ms
如果你想让它立即运行,然后每5分钟运行一次,你可以简单地这样做
$(document).ready(function() {
getAjaxNotice();
function getAjaxNotice() {
$.post("/async/getnotification" ,
{},
function(response)
{
var notice = $(response);
$("#notices").prepend(notice);
});
return false;
}
setInterval( getAjaxNotice(), 300000 );
});
对于第一个问题,您应该存储来自
setInterval
的返回值,然后在收到警报时调用clearInterval(myIntervalId)
对于第二个问题,您可以在车身装载期间调用一次
getAjaxNotice
,然后如果没有收到警报,则在该点调用setInterval
。setInterval
的时间以毫秒为单位
5 minutes * 60 seconds * 1000 milliseconds = 300000ms
另外,我建议您将函数传递给setInterval
而不是字符串,这样可以避免隐式使用eval
setInterval(getAjaxNotice, 300000);
要在页面开头调用getAjaxNotice
,请将其放入ready
块中
$(function(){
getAjaxNotice();
});
首先,您应该将初始化代码包装在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 在你的情况下,听起来你在处理一些问题。因此,使用当前的方法,您可以首先进行ajax调用,然后设置超时:
getAjaxNotice();
setTimeout( "getAjaxNotice()", 300000);
其次,如果您有某种类型的“消息确认”事件,确保用户只收到一次消息是很容易做到的。假设您的用户可以在多台计算机上打开浏览器,如果您让用户单击消息或单击“确定”按钮,或执行某些操作以确认他们收到了消息,您可以启动另一个ajax调用以从服务器上的缓冲区中删除该消息,但仍然在所有打开的浏览器上显示该消息。本地浏览器将只显示一次,因为如果消息重复,您可以阻止在客户端显示它(基于任何对您的应用程序有意义的标准)
但是,您应该研究长轮询和COMET。Comet是一个基于服务器端事件向web浏览器推送通知的概念,与web浏览器不断请求服务器更改相反
由于web框架和浏览器的限制,这是通过一些技术实现的,但长轮询似乎是最普遍的。HTML5和websockets正试图做出一些改变,这些改变可能会阻止同时进行轮询,但目前还没有现成的版本
meebo和facebook等公司已经使用了长轮询和基于COMET的体系结构。请不要引用我的话,但出于某种原因,我倾向于相信facebook使用基于Erlang的Web服务器来服务他们的聊天信息。Erlang和NodeJs只是两个解决方案,您可以使用它们构建轻量级的web服务器,这些服务器可以很好地处理大量长轮询请求
你绝对应该自己去阅读所有这些东西,因为有大量的信息可供利用。我已经在AmazonEC2上尝试过创建一个NodeJs服务器,因为我传统上是一个.NET工作,我不认为IIS是支持.NET应用程序的长轮询功能的正确解决方案,该应用程序使用长轮询,我不得不说我非常喜欢NodeJs。另外,javascript语言比我对Erlang的有限知识更为熟悉。是的,我同意,在这种情况下,没有理由向setInterval传递字符串。除非有某种情有可原的情况,否则您应该尝试将函数传递给setInterval/setTimeout。我不确定当他们引入“严格模式”时,传递字符串是否有效,我认为严格模式不允许使用eval。是的,存储返回值肯定是好的。特别是当你需要在某个时刻取消计时器时。我不知道每次打电话后我是否会把它清除掉。这本质上与只调用setTimeout(functionX,timeoutPeriod)相同,然后在functionX内部调用setTimeout(functionX,timeoutPeriod)。因此,我会说,当你完成时,只需清除间隔。@Mark,我想我的帖子不清楚;我原本打算在收到警报时(而不是每次呼叫后)清除间隔。OP似乎希望在该点停止查询。