单击子项时如何忽略单击事件

Eli*_*lie 27 jquery

所以我有以下场景:

<div id="block">
Sample text.
<a href="#">Anchor link</a>
</div>

<script type="text/javascript">
    $("#block").click(function() { alert('test'); });
</script>
Run Code Online (Sandbox Code Playgroud)

当我点击div内的任何地方时,我都会收到"测试"警报.但是,当我点击"锚点链接"时,我希望防止这种情况发生.我该如何实现呢?

谢谢

Nic*_*ver 31

您可以通过附加处理程序阻止点击从链接冒泡,如下所示:

$("#block a").click(function(e) { e.stopPropagation(); });
Run Code Online (Sandbox Code Playgroud)

我们在评论中讨论的替代方案:

$("#block").delegate('a', 'click', function(e){ e.stopImmediatePropagation(); })
           .click(function() { alert('test'); });?
Run Code Online (Sandbox Code Playgroud)

这可以防止任何子链接冒泡(好吧,不是真的,但是他们的处理程序不执行),但是没有为每个元素创建一个处理程序,这是通过.stopImmediatePropagation().

  • 为了防止事件传播(当然这取决于链接的数量),为每个链接添加一个点击处理程序感觉有些"过度".但这是防止任何特定元素的事件传播的好方法. (4认同)

Ali*_*aru 14

这就是您所需要的:http://api.jquery.com/event.target/.

只需比较一下,检查元素是否由您想要的元素或其子元素触发.


Fel*_*ing 6

您可以使用事件对象的target属性测试单击了哪个节点:

$("#block").click(function(event) { 
    if(event.target.nodeName != 'A') {
        alert('test');
    }
});
Run Code Online (Sandbox Code Playgroud)

我建议从quirksmode.org阅读事件属性.