這裏是一個演示(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