【问题标题】:Weird setTimeout issue奇怪的 setTimeout 问题
【发布时间】:2012-03-15 11:25:32
【问题描述】:

我有这个问题。我定义了一个删除链接的函数(只是为了举例),所以我希望在链接上的 mouseleave 事件之后,它会在 5 秒(或其他任何时间)后消失。此外,如果我将鼠标输入到同一链接上(表面上已运行 setTimeout),则该 setTimeout 将被取消。例如,以下代码有效,但由于我没有定义我的 setTimeout,我无法取消它。

function func() { $('a').remove(); }
    //var interval = setTimeout( func , 5000);

    $('body').on('mouseleave', 'a', function() {
        setTimeout( func , 5000);
    });

    $('body').on('mouseenter', 'a', function(){
    //    clearTimeout(interval)
    });

相反,取消注释第二行会使链接立即消失,即使我使用的函数 func 没有括号,所以我认为这不会是一个问题 (fiddle):

function func() { $('a').remove(); }
    var interval = setTimeout( func , 5000);

    $('body').on('mouseleave', 'a', function() {
        interval
    });

    $('body').on('mouseenter', 'a', function(){
    //    clearTimeout(interval)
    });

我可以做些什么来实现预期的功能?

谢谢!

【问题讨论】:

    标签: javascript events settimeout


    【解决方案1】:

    您需要结合(是的,这是一个技术术语)您的两次尝试。在func 鼠标处理程序之外声明interval,以便两个处理程序都可以引用它。

    function func() {
        $('a').remove();
    }
    
    var interval;
    
    $('body').on('mouseleave', 'a', function() {
        interval = setTimeout(func, 5000);
    });
    
    $('body').on('mouseenter', 'a', function() {
        clearTimeout(interval);
    });​
    

    http://jsfiddle.net/mattball/2XN9a/

    【讨论】:

    • 是的。你离得太近了!您应该尝试在调试器中四处寻找,看看下次会发生什么。
    • 我经常使用console.log,但我没有想到要在外部定义“间隔”,并且在mouseleave函数内部使用interval = setTimeout。
    • console.log 只是调试工具库中的众多工具之一。我的意思是:设置断点,单步执行代码——那种调试。
    • 通常我会这样做...我会更频繁地这样做:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2018-06-26
    • 2011-08-13
    • 2011-08-17
    • 2011-02-02
    • 2021-10-10
    • 2014-04-21
    相关资源
    最近更新 更多