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) {...