我有以下的HTML表:停止JS-事件傳播單擊
<table>
<tr>
<td>
Row 1
</td>
<td>
<!-- Hidden JSF-button -->
<button class="hide" />
</td>
</tr>
</table>
當我點擊一個tr
,我觸發隱藏按鈕點擊與JS:
$('table tr').on('click', function(e) {
var $button = $(this).find('button');
console.log('trigger click on', $button);
$button.trigger('click');
});
單擊事件向上傳播,並會導致永無止境的循環(在這裏可以看到:http://codepen.io/anon/pen/kDxHy)
一些SO搜索之後,很顯然,解決的辦法就是撥打event.stopPropagation
,
像這樣(在這裏可以看到:http://codepen.io/anon/pen/BnlfA):
$('table tr').on('click', function(e) {
var $button = $(this).find('button');
// Prevent the event from bubbling up the DOM tree.
$button
.off('click')
.on('click', function(e) {
console.log('click');
e.stopPropagation();
return true;
});
console.log('trigger click on', $button);
$button.trigger('click');
});
上述工程的解決方案。但它感覺像一個黑客,我不喜歡它。
是否需要在$button
上註冊點擊處理程序才能撥打event.stopPropagation
?有沒有更好的方法來阻止bubbeling的點擊事件?
爲什麼你需要觸發點擊那個隱藏按鈕? – magyar1984
該按鈕實際上是一個隱藏的JSF按鈕(http://www.mkyong.com/jsf2/jsf-2-button-and-commandbutton-example/)。當用戶點擊表格中的一行時,我觸發點擊按鈕,該按鈕調用支持控制器(服務器端)來設置一個值。 – nekman
對不起,我不知道MVC是否涉及。我不確定這是否有幫助,但是當您觸發事件automaticaly時,event.target是什麼?如果它是按鈕,那麼你可以過濾它並在tr事件處理程序中停止傳播? – magyar1984