0

可能重复:
jQuery - 单击 div 时的 on() 函数,但单击该 div 的子项时不会

$(oTrPlanning).prev().children('td').each(function () {
    this.onclick = setCountClick;
});

点击 TDsetCountClick()被调用,但 TD 还包含一个Textbox

<td> 
    <input class="Input-InlineFilter" id="TextFirst"  type="text" value="">
</td>

因此,当我开始在 上输入内容时TextboxsetCountClick()再次调用。我想在setCountClick()点击 TD 时打电话,但不是Textbox.

4

2 回答 2

5

click 事件使 DOM 从textboxtd,一直到body. 如果您不希望textbox点击触发td点击处理程序,则需要停止冒泡:

$('#TextFirst').click(function (e) {
    e.stopPropogation();
});

stopPropagation 的文档

为了扩展,您应该利用这种冒泡只为所有s绑定一个事件处理程序:td

// bind one handler to all tds
$(oTrPlanning).prev().on('click', 'td', function (e) {
    // ensure the clicked element is a TD
    if (this.nodeName === 'TD') {
        setCountClick(e);
    }
});

nodeName 的文档

this请注意,如果您在 内部的任何地方都依赖操作员setCountClick,它可能不再按预期工作。要解决这个问题,您需要考虑使用$.proxybind调用时setCountClick

setCountClick.bind(this)(e);

bind返回一个新函数,该函数使用您传递的this参数作为新函数内部的参数。然后执行该函数并将常规参数传递给它。

绑定文档

于 2013-01-09T15:16:03.473 回答
0

问题是事件是从孩子传播给父母的。你可以这样绑定:

$(oTrPlanning).prev().on('click', 'td', setCountClick);

您的方法setCountClick将接收event作为它的第一个参数,您可以像这样检查它:

function setCountClick(event) {  
   // make sure the click was on a TD and not something else
   if ($(event.target).is('td')) {
        // you've hit a TD, run your code here
   }

}
于 2013-01-09T15:23:32.820 回答