2012-04-05 62 views
0

我试图在用户单击div后添加一个$('body').live('click')侦听器。目的是创建一个自定义下拉框,用户可以通过点击页面上的任何位置打开并最终关闭。在.click()函数中使用.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()错了吗?我如何避免这种递归?

+0

解释什么是你想这样做,而不是解释目前自己在做什么。也许我们可以提供替代方案,而不是修复潜在的错误代码。 – Joseph 2012-04-05 02:47:26

回答

3

return false将停止事件传播:

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

谢谢,这也有效,比传递一个事件并使用event.stopPropagation()更容易一些。 – podcastfan88 2012-04-05 02:59:02

+0

始终欢迎:-) – 2012-04-05 03:03:10

+2

@stuart - 仅供参考,返回'false'与e.stopPropagation()不完全相同。返回false会导致jQuery同时执行'e.stopPropagation()'和'e.preventDefault()'。在这种情况下,也许对你没有什么不同,但你应该明白它不完全一样。就传递给事件处理程序的事件而言,无论您是否声明参数,它总是传递给事件处理程序 - 它始终存在。 – jfriend00 2012-04-05 03:03:25

0

使用第二主体点击不活的(你也并不需要它,因为它总是页面上),并使用超时结合:

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

}); 
+0

我的测试显示这仍然触发自己:http://jsfiddle.net/GsP5j/1/。我使用'live()',因为我不希望'$('body')'总是接受点击事件。 – podcastfan88 2012-04-05 02:49:42

+0

请重新检查与超时 – Rustam 2012-04-05 02:53:45

+0

变种工作,感谢您的选择。 – podcastfan88 2012-04-05 03:05:39

0

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

0

您可能不得不停止当前事件的传播,以防止其冒泡到新事件处理程序将看到它的正文。此外,你可以使用.one()为一次性事件处理程序:

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

谢谢,这工作!我听说过关于传播的问题,但以前从来不需要担心。 – podcastfan88 2012-04-05 02:54:58