Javascript - 停止重复功能

时间:2011-05-26 07:19:59

标签: javascript jquery

  

可能重复:
  How to pause a setTimeout call ?

我有一个在页面加载时调用的函数,它从重复函数开始:

        setTimeout(function () {
            repeat();
        }, 8000)

这个函数每8秒调用repeat(),在这个函数里面我有一些ajax来更新页面上的计数器。单击计数器会为用户提供一个包含许多消息的下拉菜单。计数器值等于用户拥有的消息数。有点像Facebook通知。

单击下拉菜单时使用jQuery隐藏并显示它:

  $('#messages').click(function () {
        $('#messagesDropDown').slideDown();
    })
    .mouseleave(function () {
        $('#messagesDropDown').slideUp();
    });

#messagesDropDown可见时,我想停止repeat()功能,以防止在查看当前消息时更新消息列表。

在.mouseleave上我想再次启动repeat()功能。

任何人都有任何想法如何“停止”重复功能在.click功能中再次在.mouseleave上启动?

2 个答案:

答案 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}}来电)。

如果是这样,您有两种选择:

  1. 有一个控制变量告诉setTimeout是否要做它的工作。一个简单的布尔值就可以了。如果希望repeat跳过其工作,并设置repeat,请设置布尔值。这是死的简单答案。

  2. 拥有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