我有这个函数应该每隔4秒查询一次可能已经发布的新内容的数据库。然后我接受返回并使用从服务器返回的任何内容制作的动态html刷新一个feed。这一切都很有效。
我的问题是,作为HTML的一部分,有一个选项托盘,他们可以按下它将滑过部分内容,并给他们不同的选项来处理该内容,删除,复制,评论这样的东西。好吧,当他们弹出托盘我想清除间隔计时器,这样它就不会刷新饲料中的html(使托盘消失)。
另一个问题是用户可以同时打开多个托盘,所以我想出了这个功能来处理它:
function setTimers(status)
{
var timerGetContent = null;
if(status == "login")
{
tray_count = 0;
timerGetContent = null;
timerGetContent = setInterval(getContent,4000);
alert("inside login");
}
else if(status == "negitive")
{
tray_count--;
if(tray_count == 0 && timerGetContent == null)
{
timerGetContent = setInterval(getRecentContent,4000);
alert("inside negitive");
}
}
else if(status == "positive")
{
tray_count++;
clearInterval(timerGetContent);
timerGetContent = null;
alert("inside positive")
}
}
因此,当用户按下按钮以弹出托盘时,它会调用setTimer并在其执行任何其他操作之前将其传递给肯定,然后当他们按下按钮关闭托盘时,它会调用setTimer并将其传递给否定。我知道调用工作并且它被传递了正确的参数,我甚至知道它进入函数的正确部分取决于按下什么但有时候间隔没有被清除并且无论什么时候它都会继续发射我做。已经工作了几个小时,我完全被难过了。
编辑:
我试图将函数外的var timerGetContent作为全局变量。这有同样的行为问题。
EDIT2:
调用setTimers函数的函数:
function slide_out(event)
{
clicked_element = document.getElementById(event.srcElement.id);
var re_clicked = new RegExp(clicked_element.className, "g");
if(clicked_element.className == "options-bar slide-out")
{
BACKGROUND.setTimers("positive");
clicked_element.className = clicked_element.className.replace(re_clicked, '');
clicked_element.className += "options-bar slide-out open";
}
else
{
clicked_element.className = clicked_element.className.replace(re_clicked, '');
clicked_element.className += "options-bar slide-out";
BACKGROUND.setTimers("negitive");
}
另一件事,setTimers函数位于扩展的后台文件中,而此函数位于弹出窗口中。