Jquery 在.click()函数中使用.live(';click';)会触发自身
我试图在用户单击div后添加一个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',
$('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()
行。感谢您的解释。我将进一步研究这些问题。