如何阻止孩子传播由live / delegate listener触发的事件?
我有一个委托父母,在一组具有特定类的子项中侦听单击事件。
$(".toggle_group").on("click",".toggle",function(e){ .. });
所以这是一个html的例子
问题是a.toggle
子a.toggle
将事件传播给父节点,当它不应该触发处理程序时。 根据jQuery文档,您无法阻止活动/委派事件侦听器上的事件传播。
如何阻止a.toggle的子子元素将事件传播给父级? 或者在某些情况下允许它?
你看到.toggle
的内部div应该是一个下拉菜单。 只有当您单击切换链接时,才能在单击菜单时切换…
检查此页面中的评论,至少有一些声称已找到解决方法。 http://api.jquery.com/event.stopPropagation/
复制来自此处的post的评论以供将来参考:
MikeW:解决.live()事件传播问题。 动态创建的节点在父节点收到之后才会收到事件。 这将导致funkyness和stopPropagation和preventDefault将无法解决此问题。 要修复:添加行
if(event.target!= this){return true; }
到父节点事件处理程序的顶部。 这将在事件实际发送到子节点时停止触发父事件,并且(与return false不同)将事件传播到目标节点。
另一种方法是仅在事件来自具有.toggle
类(或其子项之一)的元素而不是.toggle_group
元素本身时才执行函数处理程序。
$(".toggle_group").on("click",".toggle",function(e){ if (!$(e.target).is(".toggle")) return; ... });