如果有人在div之外单击,我想关闭该div。我有以下代码:
$('body').click(function(e) {
$('div.test').slideUp('slow');
});
$('div.test').live('click',function(e) {
e.stopPropagation();
});但问题是,当有人在div内部单击时,div本身就会关闭。我想阻止这种情况发生。调试后,我发现了一个奇怪的东西,调试器首先命中$(.click)而不是$(div.test),我可以知道原因吗?你能帮我解决这个问题吗?
发布于 2011-05-16 21:26:37
问题出在您使用live时。
live是一种表示“将处理程序绑定到根元素,并捕获与选择器匹配的元素上产生的任何事件”的方式。它是delegate的缩写形式。这是可能的,因为“冒泡”:元素上的事件也在元素的祖先上触发。
如果未另行指定,live会将事件处理程序绑定到document。body上的事件处理程序将首先被触发,因为事件不会冒泡到e.stopPropagation()所在的document处理程序。
最简单的解决方案是将live更改为click
$('div.test').click(function(e) {如果你需要使用live,引入一个容器元素,并在那里处理事件。我将使用delegate,因为我更喜欢它的语法,但是如果您愿意,也可以使用live:
$('#container').delegate('div.test', 'click', function(e) {
e.stopPropagation();
});该事件在#container上处理,传播被停止,因此该事件永远不会到达body的事件处理程序。
发布于 2011-05-16 21:21:48
如果你也用live()处理body点击会发生什么?
我相信实时点击处理程序不会像标准点击那样传播事件。参见this documentation。
发布于 2011-05-16 21:24:18
我认为问题的出现是因为您正在将一个单击处理程序设置为<body>
我试着用<p>代替<body>做同样的事情,它似乎工作得很好。
这里有一个相关的小提琴:
http://jsfiddle.net/seNXV/7/
https://stackoverflow.com/questions/6018031
复制相似问题