3

我正在模拟一个简单的多级下拉框,并且无法弄清楚如何在 a 悬停时仅触发一次悬停事件lia当列表项内的标签悬停时,悬停事件会触发两次。

这是一个演示问题的 jsFiddle。我在a标签周围添加了额外的填充,以显示事件如何被触发两次。如果只是悬停填充,事件将触发一次,但一旦a标签悬停,它将再次触发。

HTML:

<ul class="dropit">
    <li><a href="#">Thing 1</a></li>
    <li><a href="#">Thing 2</a></li>
    <li><a href="#">Thing 3</a>
      <ul>
        <li><a href="#">Sub-thing 1</a></li>
        <li><a href="#">Sub-thing 2</a>
           <ul class='sub-menu'>
            <li><a href="#">Sub-sub-thing 1</a></li>
            <li><a href="#">Sub-sub-thing 2</a></li>
          </ul>
        </li>
      </ul>
    </li>
</ul>

jQuery:

$(document).ready(function(e) {
    $('ul.dropit li').on('mouseover', function(event) {
        $target = $(event.currentTarget);
        $sub = $target.children('ul').first();
        $sub.slideToggle();
    }).on('mouseout', function(event) {
        $target = $(event.currentTarget);
        $target.children('ul').first().slideToggle();
    });
});

jsFiddle 演示

4

2 回答 2

9

使用mouseenterandmouseleave代替mouseoverandmouseout

小提琴

$(document).ready(function(e) {
    $('ul.dropit li').on('mouseenter', function(event) {
        $target = $(event.currentTarget);
        $sub = $target.children('ul').first();
        $sub.slideToggle();
    }).on('mouseleave', function(event) {
        $target = $(event.currentTarget);
        $target.children('ul').first().slideToggle();
    });
});​

mouseover当您将鼠标悬停在子元素上时将触发。

mouseenter无论有多少孩子悬停,都只会触发一次。

于 2012-07-16T19:29:19.027 回答
5

jsFiddle 演示

只需使用.hover()

此外,为了防止重复悬停运动时出现难看的幻灯片堆积,请使用:.stop()

$('.dropit li:has("ul")').hover(function() {
    $('>ul', this).stop().slideToggle();
});
于 2012-07-16T19:34:45.357 回答