jQuery:鼠标悬停超时

时间:2010-12-29 08:04:20

标签: javascript jquery

我有这样的剧本

$('.parent a').live('mouseover mouseout', function(event) {
    if (event.type == 'mouseover'){
        if ($(this).siblings('.child').css('width') == '0px'  ){
            $(this).siblings('.child').animate({'width': window.innerWidth}, 500);
        }
    }else{
        if ( !$(this).hasClass('active') ){
            $(this).siblings('.child').animate({'width': 0}, 500);
        }
    }
});

正如您从上面的脚本中注意到的那样,如果我们将鼠标移到$('.parent a')上,那么它的兄弟会扩展它的宽度。

现在,如果我们将鼠标移过来,它的兄弟姐妹会立即进行扩张,我希望在5 seconds之后我们已经将鼠标移除时发生这种情况

如何制作?

3 个答案:

答案 0 :(得分:4)

请注意,我添加了单独的事件侦听器,而不是在事件处理程序内针对不同的事件类型进行测试。

var timer;

$('.parent a').live('mouseover', function(event) {
    $Sibling = $(this).siblings(".child");
    timer = window.setTimeout(function() {
        if ($Sibling.css('width') == '0px'  ){
            $Sibling.animate({'width': window.innerWidth+"px"}, 500);
        }}, 5000);
});

$('.parent a').live('mouseout', function(event) {
    if (timer) {
        window.clearTimeout(timer);
    }
    if ( !$(this).hasClass('active') ){
        $(this).siblings('.child').animate({'width': "0px"}, 500);
    }
});

这背后的想法是你设置一个计时器,当用户将鼠标悬停在锚点上时运行。如果在计时器触发之前它们被鼠标移出,则清除计时器以停止事件发生。否则,当计时器触发时,它将按照原始脚本扩展元素。

此外,通过让jQuery只遍历DOM一次,并将结果存储在$ Sibling中,我们使脚本更快。

为了测试这个,我使用了以下HTML。

    <div class="parent">
        <a href="#">Hello</a>
        <div class="child" style="background-color: Aqua; display: block; width: 0px; overflow: hidden;">World</div>
    </div>

答案 1 :(得分:0)

你可以使用setTimeout

$('.parent a').live('mouseover mouseout', function(event) {
    var elements = $(this).siblings('.child');
    if ($(this).siblings('.child').css('width') == '0px'  ){
        setTimeout(animate(elements, window.innerWidth), 5000);
    }
}else{
    if ( !$(this).hasClass('active') ){
        setTimeout(animate(elements, 0), 5000);
    }

});

function animate(elements, width) {
    elements.animate({'width': width}, 500);
}

答案 2 :(得分:0)

您希望通过setTimeout()在此处存储计时器并通过clearTimeout()清除,但您始终希望每个元素,您可以通过{{3>像这样:

$('.parent a').live({
  mouseover: function() {
    var self = this;
    $.data(this, "timer", setTimeout(function() {
      if ($(self).siblings('.child').css('width') == '0px'  ){
        $(self).siblings('.child').animate({'width': window.innerWidth}, 500);
      }
    }, 5000));
  },
  mouseout: function() {
    clearTimeout($.data(this, "timer"));
    if ( !$(this).hasClass('active') ){
      $(this).siblings('.child').animate({'width': 0}, 500);
    }
  }
});

$.data(),我发现上面的内容更容易在jQuery 1.4.3+中阅读,但如果您使用的是早期版本,请按照之前的格式进行格式化:

$('.parent a').live('mouseover mouseout', function(event) {
  if (event.type == 'mouseover'){
    var self = this;
    $.data(this, "timer", setTimeout(function() {
      if ($(self).siblings('.child').css('width') == '0px'  ){
        $(self).siblings('.child').animate({'width': window.innerWidth}, 500);
      }
    }, 5000));
  }else{
    clearTimeout($.data(this, "timer"));
    if ( !$(this).hasClass('active') ){
      $(this).siblings('.child').animate({'width': 0}, 500);
    }
  }
});

You can test it out here