所以我有以下场景:
<div id="block">
Sample text.
<a href="#">Anchor link</a>
</div>
<script type="text/javascript">
$("#block").click(function() { alert('test'); });
</script>
我在div内的任何位置单击时,都会弹出“test”提示。但是,当我单击“锚链接”时,我想阻止这种情况发生。如何实现这一点?
谢谢
所以我有以下场景:
<div id="block">
Sample text.
<a href="#">Anchor link</a>
</div>
<script type="text/javascript">
$("#block").click(function() { alert('test'); });
</script>
我在div内的任何位置单击时,都会弹出“test”提示。但是,当我单击“锚链接”时,我想阻止这种情况发生。如何实现这一点?
谢谢
您可以通过添加额外的处理程序来阻止来自链接的点击事件向上传递,像这样:
$("#block a").click(function(e) { e.stopPropagation(); });
我们在评论中讨论的替代方案:
$("#block").delegate('a', 'click', function(e){ e.stopImmediatePropagation(); })
.click(function() { alert('test'); });
这将阻止任何子链接冒泡(实际上并不是这样,但它们的处理程序不会执行),但不会为每个元素创建一个处理程序,这是通过.stopImmediatePropagation()
完成的。
$("#block").click(function(event) {
if($(event.target).attr('id') == $(this).attr('id'))
{
alert('test');
}
});
这里有一个演示(jsfiddle),包含一个表单和两个字段:
<div id="container">
<form>
<div class="field">
<input id="demo" type="text" name="demo" />
</div>
<div class="field">
<input id="demo2" type="text" name="demo2" />
</div>
</form>
</div>
$(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');
}
});
});
this
,因此您可以轻松地检查当前事件是否由DOM节点发布,方法是检查。this == evt.target
CSS:
#container {
width: 600px;
height: 600px;
background: blue;
}
.field {
background: green;
}
.delegate()
处理程序的不同方法 :) (您还可以在其他单击处理程序之前使用上面的委托版本)。 - Nick Craverdelegate()
,但对我无效:http://jsfiddle.net/cxcfA/。我猜是因为事件已经冒泡了。或者你是指其他什么? - Felix Klinge.stopImmediatePropagation();
;) http://jsfiddle.net/nick_craver/cxcfA/1/ - Nick Craver