【问题标题】:jQuery mouseenter and mouseleave events fire out of controljQuery mouseenter 和 mouseleave 事件失控触发
【发布时间】:2013-08-15 12:17:31
【问题描述】:

我正在使用这段代码用悬停元素的内容填充 div。

$('.gallery .thumbs a').hover(
  function(){
    var target = $(this);
    $('.hover-box').html(target.clone());
    var top = target.offset().top;
    var left = target.offset().left;
    $('.hover-box').css({'display':'block', 'top':top, 'left':left}); 
  },
  function(){
    $('.hover-box').hide();
  }
);

问题是 - 许多人似乎都遇到过 - 添加“mouseleave”处理程序后,两个事件都开始不受控制地触发。

我知道与 mouseover/out 相关的冒泡问题,但这似乎表现相同。

有人知道为什么会这样吗?

编辑:

这是关于小提琴的交易。不是最漂亮的景象,但功能与我的问题相同。 FIDDLE

【问题讨论】:

  • 您可能会弹出鼠标指针所在的元素,多次触发事件。设置一个 JSFiddle,以便我们了解它应该如何工作!
  • 我同意@adeneo。尝试将“顶部”和“左侧”变量更改为新位置(例如 0,0),看看会发生什么。

标签: javascript jquery hover mouseevent


【解决方案1】:

这是因为您的函数会在每个hover 以及每个hover 的末尾触发和重新触发,所以每当您移动鼠标时,它都会触发两次。你想要做的就是在.thumbs amouseenter.hover-boxmouseleave 上开火,like this

jQuery(function () {
    jQuery('.thumbs a').hover(

    function () {
        var target = $(this);
        jQuery('.hover-box').html(target.clone());
        var top = target.offset().top;
        var left = target.offset().left;
        jQuery('.hover-box').css({
            'display': 'block',
            'top': top,
            'left': left
        });
    });
    $('.hover-box').mouseleave(function() {
        $('.hover-box').hide();
    });
});

【讨论】:

  • 你的问题是“.hover-box”的位置与“.thumbs a”的位置是对的,所以当“.hover-box”显示时,会触发“mouseleave” “.thumbs a”事件;然而,当 '.hover-box' 隐藏时,'.thumbs a' 的 'mouseover' 事件会再次被触发。所以这是一种循环。这就是它失控的原因。
  • @Sphinx 感谢您对这种情况的更好表述
  • 当然这是问题所在。非常感谢您的启发。我今天在工作中会试一试,但我确信这是正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多