当孩子徘徊时,悬停事件发生两次

Chr*_*asa 3 html css jquery

我正在嘲笑一个简单的多级下拉框,并且无法弄清楚如何在悬停时让悬停事件仅触发一次li.当a列表项内的标记悬停时,悬停事件将触发两次.

这是一个演示问题的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>
Run Code Online (Sandbox Code Playgroud)

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();
    });
});
Run Code Online (Sandbox Code Playgroud)

jsFiddle示范

Tur*_*nip 10

使用mouseentermouseleave不是mouseovermouseout

小提琴

$(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();
    });
});?
Run Code Online (Sandbox Code Playgroud)

mouseover 将鼠标悬停在子元素上时会触发.

mouseenter 无论有多少孩子徘徊,只会发射一次.


Rok*_*jan 5

jsFiddle演示

只是用 .hover()

此外,为防止在重复悬停运动中出现丑陋的幻灯片,请使用:.stop()

$('.dropit li:has("ul")').hover(function() {
    $('>ul', this).stop().slideToggle();
});
Run Code Online (Sandbox Code Playgroud)