代码之家  ›  专栏  ›  技术社区  ›  ggutenberg

clearTimeout on Mouseover事件未清除setTimeout from Mouseout事件

  •  4
  • ggutenberg  · 技术社区  · 14 年前

    我有一些代码将mouseover事件和mouseout事件添加到页面上的所有“a”标记中。我希望鼠标能启动一个5秒的计时器,然后调用一个函数。但是,如果触发新的mouseover事件,它应该取消任何现有的计时器。我使用的代码如下。setTimeout()工作正常,但是cleartTimeout()似乎没有引用正确的timeoutID,即使我全局声明了它。有什么建议吗?

    var timeoutID;
    
    function addMouseoverEvent() {
        $('a').each(function(index) {
            $(this).mouseover(function() {
                clearTimeout(timeoutID);
                // do stuff
            })
        }); 
    }
    
    function addMouseoutEvent() {
        $('a').each(function(index) {
            $(this).mouseout(function() {
                timeoutID = setTimeout(function() {
                    // do stuff
                }, 5000);
            })
        });
    }
    
    $(window).load(function() {
        addMouseoverEvent();
        addMouseoutEvent();
    });
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   prodigitalson    14 年前

    如果您的timeoutId是globall,那么它将在的每个迭代中被覆盖 $('a').each() delay 最有可能的方法。或者可以使用$(this).data('timeoutId',setTimeout(youFunction)`)将timeoutId存储在元素上。

        2
  •  4
  •   Ken Redler    13 年前

    .each() 调用使其看起来像所需的那样工作。试试这个小游戏 this Fiddle

    (function game () {
        var timeoutID;
        $('a').mouseover(function() {
            $('#box').html('All is well.').removeClass('bang');
            clearTimeout(timeoutID);
            // do stuff
        });
        $('a').mouseout(function() {
            $('#box').html('You have 2 seconds to return!');
            timeoutID = setTimeout(function() {
                $('#box').addClass('bang').html('Too Late!');
                // do stuff
            }, 2000);
        });
    }());