2013-01-09 222 views
0

可能重复:
jQuery - on() function when a div is clicked, but not when a child of that div is clicked在点击TD,文本框被点击

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

在TD setCountClick()的点击被调用,但TD还包含了Textbox

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

因此,当我开始在Textbox上输入内容时,setCountClick()再次被调用。 单击TD时,我想调用setCountClick(),但不是Textbox

+2

哇喔哇。你为什么要这样绑定'click'?为什么不能'$(oTrPlanning).prev()。on('click','td',setCountClick)'? – Mathletics

+0

我只是要刺穿这个,但会onclick =“返回false;”在文本框中防止? – Bender

+0

@Mathletics将做到这一点 – Yogesh

回答

5

点击事件将DOM从textbox增加到td,一直到body。如果你不想textbox点击触发td单击处理程序,你需要停止冒泡:

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

Documentation for stopPropagation

扩大,你应该考虑这个冒泡的优势,只能绑定一个事件处理程序,所有td S:

// 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); 
    } 
}); 

Documentation for nodeName

请注意,如果您依靠this运营商在setCountClick以内的任何地方运营,它可能不再按预期工作。为了解决这个问题,你就需要考虑使用$.proxybind,当你调用setCountClick

setCountClick.bind(this)(e); 

bind返回使用您通过为新函数内this参数必须一个新的功能。然后执行该函数并将其传递给您的常规参数。

Documentation for bind

+0

为什么添加另一个绑定,当你只能检查父级的绑定处理程序中的目标? – Mathletics

+0

现在使用第一个'click'来设置点击处理程序;我以为OP想要实际上点击点击处理程序? – Mathletics

+0

@Mathletics谢谢,错过了。 – jbabey

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 
    } 

}