jQuery绑定回调触发自己



我有一个菜单,在单击某个元素时显示,我想在它的回调中做的是将单击事件绑定到主体,以便您可以单击任何地方使菜单隐藏(然后取消绑定新绑定)。

$('#menu_button').click(function(){
    $('#user_menu').toggle();
}, function(){
    $('body').bind('click', function(){
          if($('#user_menu').css('display') == 'block')
                $('#user_menu').hide();
    }, function(){
          $('body').unbind('click');
    }); 
});

问题是它不仅绑定click on body,而且还触发那个事件。我尝试在settimeout中包装该绑定以添加延迟,但刚刚绑定的body click事件最终会触发(并且菜单从未显示,令人失望)。有更好的办法处理这个案子吗?

我认为可以这样做:

$('#menu_button').click(function () {
    $('#user_menu').toggle(function(){
        $("body").bind("click",function(){
            $('#user_menu').hide();
            $("body").unbind("click");
        });
    });
});

我想到了我的问题的答案,基于这个响应:jQuery -隐藏div菜单后点击外部div

我的解决方案有点不同,它是这样的:

$(document).click(function(e){
    var clicked = e.target.id;
    if(clicked != 'menu_button') {
        $('#user_menu').hide();
    }
});

就这么简单,哈哈。我以前不知道。target这个名字,我一定会记得的。

嗯,我不确定我是否理解你的问题。我的问题是:为什么使用.bind()方法?对于像你这样的人,我通常这样做:

$(document).ready(function(){
  $('#menu_button').on('click', function(e) {
    e.preventDefault();
    e.stopPropagation();
    $('#user_menu').show();
    $(document).on('click', function(e) {
      if( $('#user_menu').has(e.target).length === 0 ) {
        $('#user_menu').hide();
      }
    });
  });
});

这里的工作示例:http://jsfiddle.net/m2ry2ajn/1/

相关内容

  • 没有找到相关文章

最新更新