我的第一列有一个复选框。当我单击该行的任何位置时,将在表行上设置“row_selected”类,并选中该复选框。代码如下:
$('#my_table > tbody > tr > td').live('click', function() {
if ($(this).parent().hasClass('row_selected')) {
$(this).parent().removeClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", false)
} else {
$(this).parent().addClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", true)
}
})
问题是某些表格单元格有按钮,如果单击这些按钮,我不希望该行被选中。即。
<tr>
<td class="checkbox">
<input type="checkbox" checked="false"/>
</td>
<td>blah<td>
<td>
<a class="myButton">do stuff</a>
</td>
<td>blah<td>
</tr>
我希望jquery click事件能够工作,除非我点击myButton。
有人有任何想法吗?
答案 0 :(得分:5)
难道你不能在myButton类元素上停止传播吗?
$('a.myButton').click(function(e) {
e.stopPropagation();
});
这是一个简化的 jsFiddle example ,使用您的代码显示td点击触发器的工作方式,除非点击链接。
答案 1 :(得分:1)
$('#my_table > tbody > tr > td').live('click', function() {
if ($(this).children('a.myButton').length) return true; // prevents click on link
if ($(this).parent().hasClass('row_selected')) {
$(this).parent().removeClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", false)
} else {
$(this).parent().addClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", true)
}
})
你试图在你的td中找到一个链接,如果它发现它将返回true,那么链接将继续工作。 (如果您不希望链接执行“单击”操作,则返回false)
在jsFiddle上创建了一个简单示例。
如果您将.stopPropagation
更改为.live
.on
$('a.myButton').click(function(e) {
e.stopPropagation();
});
$('#my_table > tbody > tr > td').on('click', function() {
if ($(this).parent().hasClass('row_selected')) {
$(this).parent().removeClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", false)
} else {
$(this).parent().addClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", true)
}
})
Here您可以看到.stopPropagation
在不使用.live
的情况下工作的不同示例。
它只适用于jQuery1.7 +
答案 2 :(得分:1)
我是通过在方法开始时获取事件源并返回,如果它不是我期望的那样。例如
function getEventSrc(e)
{
var eventIsFiredFromElement = e.target;
if(eventIsFiredFromElement==null)
{
// I.E.
eventIsFiredFromElement = e.srcElement;
}
return(eventIsFiredFromElement.type);
}
返回单击的元素类型。看起来你想停下来,如果它是一个按钮。
$('#my_table > tbody > tr > td').live('click', function(ev) {
// Make sure event is not comming from a button.
if(getEventSrc(ev) == 'button'){return;}
if ($(this).children('a.myButton').length) return true; // prevents click on link
if ($(this).parent().hasClass('row_selected')) {
$(this).parent().removeClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", false)
} else {
$(this).parent().addClass('row_selected')
$('td.checkbox input', this.parentNode).prop("checked", true)
}
})