jQuery 单击对象时为对象设置动画,单击主体时再次设置动画

jQuery animate an object when object clicked and when body is clicked, animate again

嗨,我有这个简单的 jQuery 代码:

var main = function() {
    $('.menu-icon').click(function() {
        $('.menu').animate({
            left: '0px'
        }, 200);
    });
    $('body').click(function() {
        $('.menu').animate({
            left: '-200px'
        }, 200);
    });
};

$(document).ready(main);

我想让菜单在单击 .menu-icon 时出现,在单击除 .menu 和 .menu-icon 以外的所有内容时消失。当我按下 .menu-icon 时,两个动画都会发生。我还想为下面列表中的每个项目创建一个特殊页面,当按下菜单时它会加载该页面。

我有这个列表:

<div class="menu">
        <ul>
            <li><a href="#"><div class="home">Home</div></a></li>
            <li><a href="#"><div class="apps">Apps</div></a></li>
            <li><a href="#"><div class="themes">Themes</div></a></li>
            <li><a href="#"><div class="request">Requests/Fixes</div></a></li>
            <li><a href="#"><div class="help">Help</div></a></li>
            <li><a href="#"><div class="about">About</div></a></li>
        </ul>
</div>

将主体处理程序注册为 one 事件,这意味着它只会 运行 一次。然后在你点击元素后声明:

var main = function() {
    $('.menu-icon').click(function() {
        $('.menu').animate({
            left: '0px'
        }, 200);

        // Bind once here
        $('body').one('click',  function() {
            $('.menu').animate({
                left: '-200px'
            }, 200);
        });
    });
};

$(document).ready(main);

这样事件处理程序只存在,而 .menu 正在显示。多田!

单击气泡,因此当您单击 .menu-icon 时,单击也会传播到正文,同时触发两个事件处理程序。

您可以改为使用单个事件处理程序来执行此操作

$(function() {
    $(document).on('click', function(e) {
        var left = '-200px';

        if ( $(e.target).closest('.menu-icon').length ) {
            left = '0px';
        }

        $('.menu').animate({
            left: left
        }, 200);

    });
});