【问题标题】:jquery: error in mouseenter() mouseleave() animationjquery:mouseenter()mouseleave()动画中的错误
【发布时间】:2012-02-17 21:00:12
【问题描述】:

我正在尝试使用 jquery 在页面的侧边栏中创建一个垂直滚动菜单,代码如下: HTML:

<ul class="side-menu">
<li id="menu1" ><a href="#">Item-1</a>
    <ul class="inner-side-menu" id="menu1_inner">
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
    </ul>
</li>
<li id="menu2"><a href="#">Item-2</a>
    <ul class="inner-side-menu" id="menu2_inner">
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
    </ul>
</li>
<li id="menu3"><a href="#">Item-3</a>
    <ul class="inner-side-menu" id="menu3_inner">
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
    </ul>
</li>
<li id="menu4"><a href="#">Item-4</a>
    <ul class="inner-side-menu" id="menu4_inner">
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
        <li><a href="#">Sub-item</a></li>
    </ul>
</li>

JQuery:

<script type="text/javascript">
$('#menu1').mouseenter(function(){
    $('#menu1_inner').show('slow');
}).mouseleave(function(){
    $('#menu1_inner').hide('slow');
});
//Similar for #menu2, #menu3 and #menu4
</script>

我遇到了一个非常奇怪的错误,在正常情况下,代码运行良好,但如果我将鼠标悬停在 #menu1/2/3/4 上并立即离开,则相应的 #menu_inner 动画两次或三次似乎它以相同的效果多次动画没有鼠标进入或离开的次数。

这里实际发生了什么?解决方案是什么? p.s.:我在 firefox 10、IE9、Maxthon 3 和 Opera 11 中测试过同样的错误。

【问题讨论】:

    标签: jquery mouseenter mouseleave


    【解决方案1】:

    发生这种情况是因为动画已排队并且除非您强行停止它们,否则它们会继续运行。使用stop方法停止之前的动画。

    $('#menu1').mouseenter(function(){
        $('#menu1_inner').stop(true, true).show('slow');
    }).mouseleave(function(){
        $('#menu1_inner').stop(true, true).hide('slow');
    });
    

    stop(clearQueue, jumpToEnd)- 停止匹配元素上当前正在运行的动画。

    【讨论】:

    • 这很好用。但我可以用这个设置动画开始时间吗?我的意思是stop 整个menu_inner 突然打开,这对于长列表来说不是一件好事,我可以为mouseenter 设置时间,以便函数在show() 调用之前等待1 或几秒钟吗?谢谢
    • @Asif - 添加计时器不是一个好主意,但如果您愿意,您仍然可以在调用 stop() 之前使用 jQuery .delay(timeInMilliseconds)
    • 因为如果你一直在鼠标移出鼠标,行为将不会很好。但是你可以我没说不要用。
    • delay 的使用只是不必要的,可以忽略没有任何问题..
    【解决方案2】:

    你可以更优雅地使用 hover 函数,而不是 mouseentermouseleave 函数。

    $('#menu1').hover(function()
    {$(this).fadeOut(100);$(this).fadeIn(500);});  
    

    这里是official documentation with example

    【讨论】:

    • 这不会解决问题中描述的问题。 hover 只是 mouseenter/mouseleave 的简写。
    • 感谢@Vivek,但我有使用mouseentermouseleave 的具体原因,因为我可以轻松地为两个不同的鼠标事件函数设置不同的动画和效果时间。
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多