jQuery,单击事件,递归太多
有人能告诉我为什么这个代码:jQuery,单击事件,递归太多,jquery,click,Jquery,Click,有人能告诉我为什么这个代码: $('#places-view > tbody').find('td').click(function(evt) { var td = $(this), input = td.find('input'); console.log('click'); console.log(input.attr('disabled'), 'disabled'); if (! input.attr('disa
$('#places-view > tbody').find('td').click(function(evt) {
var td = $(this),
input = td.find('input');
console.log('click');
console.log(input.attr('disabled'), 'disabled');
if (! input.attr('disabled')) {
input.trigger('click');
console.log('inner click');
}
})
正在引发太多递归错误
关于当您触发“click”时,它实际上不是一个单独的事件分派循环-jQuery将立即运行处理程序。由于
位于
内部,因此事件将冒泡到
本身,在那里它将再次运行到该处理程序中
还要注意,此处的这一行:
console.log(input.attr('disabled'), 'disabled');
这可能不是你想要的——我想这将永远记录“残疾”这个词。也许你是说
console.log(input.attr('disabled') + ' disabled');
要防止事件冒泡,请将
event.stopPropagation()
放在输入
元素的单击事件的处理程序中
$('#places-view input').click(function(event) {
// This will prevent the click event from bubbling up and firing
// the click event on your <td>
event.stopPropagation();
// run the rest of your click code
});
进行测试的另一种方法是:
if(input[0] != evt.target) {...
这两种方法都假设只有一个
输入。如果不是这样,那么您需要为输入提供一个标识符,以使测试更加具体。这是真的,但我想知道这是否是个好主意。如果他确实想在
级别处理“点击”,那么在
级别取消冒泡可能是不好的,因为这样会将点击分流到
。当然,这取决于表格单元格中的其他内容。@Pointy-你说得对。我的假设是,td
的点击发生在td
中的其他地方,因此,处理程序是独立的。如果不是这样,OP可能需要测试td
处理程序中的evt.target
,以查看单击是否在输入上,如果是,则绕过触发输入上的单击()
。保存了我的培根!真棒的答案+1我正在使用firebug控制台,所以在我的情况下,所有的工作都如预期的那样。
if(input[0] != evt.target) {...