我有一个容器<div>
,它有动态附加的div。 div通过click
元素给出了body
个句柄,如下所示:$(body).on("click",".divClass",function);
(我这样做,以便动态添加元素的绑定可以在一个地方完成代码,并防止大量的绑定)。我需要在容器div上放置stopPropagation()
,以便其父级的点击句柄不会被触发。问题是,当我在容器div上放置stopPropagation
时,它会阻止子div触发(因为它实际上是具有绑定的主体,而不是子div)
这是一个演示我的问题的小提琴:
$("#A").click(function() {
console.log('This event should not fire when clicking innermost')
});
$("#B").click(function(e) {
e.stopPropagation();
});
$("body").on("click", "#C", function() {
console.log('This event should fire when clicking innermost')
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="A">
outermost
<div id="B">
middle
<div id="C">
innermost
</div>
</div>
</div>
&#13;
答案 0 :(得分:2)
我希望其他孩子像往常一样繁殖,只有孩子们
#B
不应传播。
考虑到这一点,您的原始代码并没有太远。看到您在示例中直接绑定到#B
,我认为#B
是静态的。
在这种情况下,使用#B
作为静态参考,而不是body
。
$("#A").click(function(e) {
console.log('This event should not fire when clicking innermost')
});
$("#B").click(function(e) {
e.stopPropagation();
});
$("#B").on("click", "#C", function(e) {
console.log('This event should fire when clicking innermost')
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="A">
outermost
<div id="B">
middle
<div id="C">
innermost
</div>
</div>
</div>
&#13;
答案 1 :(得分:2)
如果您首先将委派的处理程序绑定到#B
,我认为整个问题会更简单。然后事件不需要冒泡到body
,stopPropagation
将产生预期效果。
$("#A").click(function() {
console.log('This event should not fire when clicking innermost')
});
$("#B").on("click", "#C", function(e) {
e.stopPropagation();
console.log('This event should fire when clicking innermost')
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="A">
outermost
<div id="B">
middle
<div id="C">
innermost
</div>
</div>
</div>