单击子项时如何忽略单击事件
所以我有以下场景:
Sample text. Anchor link $("#block").click(function() { alert('test'); });
当我点击div内的任何地方时,我都会收到“测试”警报。 但是,当我点击“锚点链接”时,我希望防止这种情况发生。 我该如何实现呢?
谢谢
您可以通过附加处理程序阻止点击从链接冒泡,如下所示:
$("#block a").click(function(e) { e.stopPropagation(); });
我们在评论中讨论的替代方案:
$("#block").delegate('a', 'click', function(e){ e.stopImmediatePropagation(); }) .click(function() { alert('test'); });
这可以防止任何子链接冒泡(好吧,不是真的,但是他们的处理程序不执行),而不是为每个元素创建一个处理程序,这是通过.stopImmediatePropagation()
来完成的。
这就是您所需要的: http : //api.jquery.com/event.target/ 。
只需比较一下,检查元素是否由您想要的元素或其子元素触发。
您可以使用事件对象的target属性测试单击了哪个节点:
$("#block").click(function(event) { if(event.target.nodeName != 'A') { alert('test'); } });
我建议从quirksmode.org阅读事件属性 。
$("#block").click(function(event) { if($(event.target).attr('id') == $(this).attr('id')) { alert('test'); } });
这是一个带有表单和两个字段的演示( jsfiddle ):
代码如下所示:
$(document).ready(function() { $('#container').click(function(evt) { if(this == evt.target) { console.log('clicked container',evt.target); $('#demo').focus(); } else { console.log('clicked child -> ignoring'); } }); $('.field').click(function(evt) { if(this == evt.target) { console.log('clicked field div',evt.target); $(this).find('input').focus(); } else { console.log('clicked child -> ignoring'); } }); });
您可以单击包含表单的容器,将焦点设置在第一个输入字段上或输入字段后面,以将焦点设置到其中。
如果单击该字段,则将忽略该单击。
上面的代码是有效的,因为jQuery在调用事件处理程序之前将DOM节点分配给this
,因此您可以通过检查来检查DOM节点是否发布了当前事件
this == evt.target
CSS:
#container { width: 600px; height: 600px; background: blue; } .field { background: green; }