Jquery 在.click()函数中使用.live(';click';)会触发自身

Jquery 在.click()函数中使用.live(';click';)会触发自身,jquery,jquery-click-event,Jquery,Jquery Click Event,我试图在用户单击div后添加一个$('body').live('click')侦听器。目的是创建一个自定义下拉框,用户可以通过单击页面上的任意位置打开并最终关闭该下拉框 但是,当我在.click()函数中添加.live()或.bind()函数时,会出于某些原因触发live()函数: $('#myDiv').click(function(){ $('#myDiv .child').show().addClass('showing'); $('body').live('click',

我试图在用户单击div后添加一个
$('body').live('click')
侦听器。目的是创建一个自定义下拉框,用户可以通过单击页面上的任意位置打开并最终关闭该下拉框

但是,当我在
.click()
函数中添加
.live()
.bind()
函数时,会出于某些原因触发
live()
函数:

$('#myDiv').click(function(){
    $('#myDiv .child').show().addClass('showing');
    $('body').live('click', function(){
           $('#myDiv .child').hide();
           $('body').die();
    })
})
#myDiv
会显示,但会立即隐藏,这一点可以通过持续显示的
.showing
类来证明


我是否使用了
live()
错误?如何避免这种递归?

使用第二个正文单击绑定而不使用live(您也不需要它,因为它总是在第页上)并使用超时:

$('#myDiv').on('click',function(){
    $('#myDiv .child').show().addClass('showing');
setTimeout(function(){
$('body').on('click', function(){
           $('#myDiv .child').hide();
           $('body').off('click');
    });
},0);

});

使用第二个正文单击绑定而不使用live(您也不需要它,因为它始终在第页上)并使用超时:

$('#myDiv').on('click',function(){
    $('#myDiv .child').show().addClass('showing');
setTimeout(function(){
$('body').on('click', function(){
           $('#myDiv .child').hide();
           $('body').off('click');
    });
},0);

});

也许它应该起作用,也许它不应该。但事实并非如此。我建议您在开始时设置所有事件处理程序,并且只使用一个全局变量(例如)来跟踪第二个事件处理程序是否应该实际响应。

可能它应该工作,也可能不应该。但事实并非如此。我建议您在开始时设置所有事件处理程序,并且只使用一个全局变量(例如)来跟踪第二个事件处理程序是否应该实际响应。

您可能必须停止当前事件的传播,以防止它冒泡到新事件处理程序将看到它的主体。此外,您可以对一次性事件处理程序使用
.one()

$('#myDiv').on('click',function(e){
    $('#myDiv .child').show().addClass('showing');
    e.stopPropagation();
    $(document.body).one('click', function() {
           $('#myDiv .child').hide();
    });
})

您可能必须停止当前事件的传播,以防止它冒泡到新事件处理程序将看到它的主体。此外,您可以对一次性事件处理程序使用
.one()

$('#myDiv').on('click',function(e){
    $('#myDiv .child').show().addClass('showing');
    e.stopPropagation();
    $(document.body).one('click', function() {
           $('#myDiv .child').hide();
    });
})

返回false
将停止事件传播:

    $('#myDiv').click(function(){
    $('#myDiv .child').show().addClass('showing');
    $('body').live('click', function(){
           $('#myDiv .child').hide();
           $('body').die();
    });
    return false;
})

返回false
将停止事件传播:

    $('#myDiv').click(function(){
    $('#myDiv .child').show().addClass('showing');
    $('body').live('click', function(){
           $('#myDiv .child').hide();
           $('body').die();
    });
    return false;
})


解释你想做什么,而不是解释你目前正在做什么。也许我们可以提供一个替代方案,而不是修复一个潜在的错误代码。请解释您正在尝试做什么,而不是解释您当前正在做什么。也许我们可以提供一个替代方案,而不是修复一个潜在的错误代码。我的测试表明这仍然会触发自身:。我使用的是
live()
,因为我不希望
$('body')
始终接受单击事件。请使用TimeOut重新检查变量。我的测试显示这仍然会触发自身:。我使用的是
live()
,因为我不希望
$('body')
总是接受点击事件。请使用timeout重新检查变量谢谢,这很有效!我听说过关于传播的事,但以前从来不用担心。谢谢,这很有效!我听说过传播,但以前不需要担心。谢谢,这也很有效,而且比传递事件和使用event.stopPropagation()要简单一些。@stuart-FYI,返回
false
e.stopPropagation()
不完全一样。返回false将导致jQuery同时执行
e.stopPropagation()
e.preventDefault()
。在这种情况下,也许对你来说没有什么不同,但你应该明白这并不完全相同。就传递给事件处理程序的事件而言,无论您是否声明参数,它总是传递给事件处理程序-它总是在那里。@jfriend00我完全同意您的看法。您应该始终知道自己在代码中执行的操作:-)此外,此示例已准备好用于
.one()
。如果您使用该行而不是
.live()
,则不需要
.die()
行。感谢您的解释。我将进一步研究这些问题。谢谢,这也很有效,而且比传递事件和使用event.stopPropagation()要简单一些。@stuart-FYI,返回
false
e.stopPropagation()
不完全相同。返回false将导致jQuery同时执行
e.stopPropagation()
e.preventDefault()
。在这种情况下,也许对你来说没有什么不同,但你应该明白这并不完全相同。就传递给事件处理程序的事件而言,无论您是否声明参数,它总是传递给事件处理程序-它总是在那里。@jfriend00我完全同意您的看法。您应该始终知道自己在代码中执行的操作:-)此外,此示例已准备好用于
.one()
。如果您使用该行而不是
.live()
,则不需要
.die()
行。感谢您的解释。我将进一步研究这些问题。