我有一个在页面加载时调用的函数,它从重复函数开始:
setTimeout(function () {
repeat();
}, 8000)
这个函数每8秒调用repeat()
,在这个函数里面我有一些ajax来更新页面上的计数器。单击计数器会为用户提供一个包含许多消息的下拉菜单。计数器值等于用户拥有的消息数。有点像Facebook通知。
单击下拉菜单时使用jQuery隐藏并显示它:
$('#messages').click(function () {
$('#messagesDropDown').slideDown();
})
.mouseleave(function () {
$('#messagesDropDown').slideUp();
});
当#messagesDropDown
可见时,我想停止repeat()
功能,以防止在查看当前消息时更新消息列表。
在.mouseleave上我想再次启动repeat()
功能。
任何人都有任何想法如何“停止”重复功能在.click
功能中再次在.mouseleave
上启动?
答案 0 :(得分:2)
setTimeout
返回超时的ID。您可以存储该值,然后使用clearTimeout
在需要时停止超时。
var timeout;
$('#messages').click(function () {
$('#messagesDropDown').slideDown(function () {
clearTimeout(timeout); // Cancel the timeout when the slideDown has completed.
});
})
.mouseleave(function () {
$('#messagesDropDown').slideUp();
clearTimeout(timeout); // Cancel incase it's still running (you can also set `timeout` to undefined when you cancel with clearTimeout, and apply some logic here (`if (timeout == undefined)` so you can leave it running rather than restarting it)
timeout = setTimeout(repeat, 8000); // Store the ID of the timeout
});
setTimeout将不设置定期事件;它只会发射一次(如延迟事件)。请改为setInterval(和clearInterval)。
答案 1 :(得分:1)
你说这段代码启动了重复功能:
setTimeout(function () {
repeat();
}, 8000)
由于setTimeout
不重复,我认为repeat
函数本身会触发另一个setTimeout
在运行后再次调用自身(链式{ {1}}来电)。
如果是这样,您有两种选择:
有一个控制变量告诉setTimeout
是否要做它的工作。一个简单的布尔值就可以了。如果希望repeat
跳过其工作,并设置repeat
,请设置布尔值。这是死的简单答案。
拥有repeat
的控制功能,如下所示:
repeat
...然后用它们来控制重复。请务必修改var repeatHandle = 0;
function startRepeat() {
if (!repeatHandle) {
repeatHandle = setTimeout(repeatTick, 8000);
}
}
function repeatTick() {
repeatHandle = 0;
repeat();
}
function stopRepeat() {
if (repeatHandle) {
clearTimeout(repeatHandle);
repeatHandle = 0;
}
}
以致电repeat
以安排下次通话,而不是直接致电startRepeat
。