首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery StopPropagation问题

jQuery StopPropagation问题
EN

Stack Overflow用户
提问于 2011-05-16 21:18:40
回答 4查看 640关注 0票数 0

如果有人在div之外单击,我想关闭该div。我有以下代码:

代码语言:javascript
复制
   $('body').click(function(e) {
        $('div.test').slideUp('slow');
    });
    $('div.test').live('click',function(e) {
        e.stopPropagation();
    });

但问题是,当有人在div内部单击时,div本身就会关闭。我想阻止这种情况发生。调试后,我发现了一个奇怪的东西,调试器首先命中$(.click)而不是$(div.test),我可以知道原因吗?你能帮我解决这个问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-16 21:26:37

问题出在您使用live时。

live是一种表示“将处理程序绑定到根元素,并捕获与选择器匹配的元素上产生的任何事件”的方式。它是delegate的缩写形式。这是可能的,因为“冒泡”:元素上的事件也在元素的祖先上触发。

如果未另行指定,live会将事件处理程序绑定到documentbody上的事件处理程序将首先被触发,因为事件不会冒泡到e.stopPropagation()所在的document处理程序。

最简单的解决方案是将live更改为click

代码语言:javascript
复制
$('div.test').click(function(e) {

如果你需要使用live,引入一个容器元素,并在那里处理事件。我将使用delegate,因为我更喜欢它的语法,但是如果您愿意,也可以使用live

代码语言:javascript
复制
$('#container').delegate('div.test', 'click', function(e) {
    e.stopPropagation();
});

该事件在#container上处理,传播被停止,因此该事件永远不会到达body的事件处理程序。

票数 5
EN

Stack Overflow用户

发布于 2011-05-16 21:21:48

如果你也用live()处理body点击会发生什么?

我相信实时点击处理程序不会像标准点击那样传播事件。参见this documentation

票数 3
EN

Stack Overflow用户

发布于 2011-05-16 21:24:18

我认为问题的出现是因为您正在将一个单击处理程序设置为<body>

我试着用<p>代替<body>做同样的事情,它似乎工作得很好。

这里有一个相关的小提琴:

http://jsfiddle.net/seNXV/7/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6018031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档