这里是一个演示(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');
}
});
});
您可以单击包含表单的容器将焦点设置在第一个输入字段或输入字段后面以将焦点置于其中。
如果你点击进入该领域,然后点击将被忽略。
上面的代码工作,因为jQuery的调用事件处理程序之前分配DOM节点this
,所以你可以很容易地检查通过检查
this == evt.target
CSS当前事件是否由DOM节点发布:
#container {
width: 600px;
height: 600px;
background: blue;
}
.field {
background: green;
}
感觉有点“矫枉过正”的点击处理程序添加到每个环节只是为了防止事件传播(当然这取决于链接的数量)。但这是防止任何特定元素事件传播的好方法。 – 2010-10-05 13:46:04
@Felix - 如果有很多环节我会采取不同的方法完全与一组.delegate的'()'处理:)(你可以用上面* *前的其他点击处理程序的委托版本,以及) 。 – 2010-10-05 13:48:03
我刚刚尝试过'delegate()',它对我不起作用:http://jsfiddle.net/cxcfA/。我假设因为这个事件已经冒出来了。或者你的意思是别的吗? – 2010-10-05 13:57:51