回调上的jQuery绑定会自动触发

回调上的jQuery绑定会自动触发,jquery,callback,event-handling,Jquery,Callback,Event Handling,我有一个菜单,可以在单击某个元素时显示,我想在它的回调上做的是将一个单击事件绑定到主体,这样您就可以在任何地方单击以隐藏菜单(然后随后取消绑定该新绑定) 问题在于,它不仅绑定了点击主体,还触发了该事件。我尝试在setTimout中包装该绑定以增加延迟,但刚刚绑定的body click事件最终会触发(而且菜单永远不会显示,bummer)。有没有更好的办法来处理这个案子?我认为可以这样做: $('#menu_button').click(function () { $('#user_menu

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


问题在于,它不仅绑定了点击主体,还触发了该事件。我尝试在setTimout中包装该绑定以增加延迟,但刚刚绑定的body click事件最终会触发(而且菜单永远不会显示,bummer)。有没有更好的办法来处理这个案子?

我认为可以这样做:

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

根据以下回答,我找到了问题的答案:

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

$(document).click(function(e){
    var clicked = e.target.id;
    if(clicked != 'menu_button') {
        $('#user_menu').hide();
    }
});
$(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();
      }
    });
  });
});

就这么简单,哈哈。我不知道。以前的目标,肯定会记得的。

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

$(document).click(function(e){
    var clicked = e.target.id;
    if(clicked != 'menu_button') {
        $('#user_menu').hide();
    }
});
$(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();
      }
    });
  });
});

这里的工作示例:

我不记得这个问题的extact解决方案,但您应该检查.blur()函数,以及event.stopPropogate()(事件冒泡)。您可以做的其他事情是使用.contains()检查触发事件的元素还有
one()
方法()。它会发射一次,然后自动解开。谢谢皮特,这会把事情弄清楚的!我尝试了blur(),它在单击#user_菜单div本身时起作用,但在文档的其余部分上不起作用。e、 stopPropagation()似乎没有帮助。编辑:我认为模糊已经实现了/是的,就是这样,谢谢!在我的例子中,我了解到按钮本身并不像一个元素那么简单,它就像是需要检查的4个不同元素(我责怪实习生哈哈)。所以我发布的答案可能比绑定一堆元素更有意义,但如果我重构,我肯定会选择这个选项。这或多或少与我的解决方案相同,将字符串比较替换为“.has()”——正如我在对构建器的评论中提到的,按钮本身由几个元素组成(这不是我的错),但当我开始重构它/制作单个元素时,无论是您的解决方案还是构建者的解决方案都会很好地工作(尽管我更喜欢他的解决方案更简洁一些)。谢谢!