2011-09-06 68 views
3

鉴于表行的一些单击事件确定目标TD:当TR被点击

$("tr.somerow").click(function(){ 
    //do some stuff 
    //can I determine the TD under the cursor at the time of clicking? 
}) 

我可以确定哪些TD(或子元素)是将光标定位在点击的时候下?

+0

将点击事件放在TD上并从中确定TR会更容易。 – RoToRa

+0

@RoToRa - 我的确想到了这一点,但我不确定是否有数十个细胞与几十个细胞相比。您还必须与填充竞争,单元格之间的间隙是否会产生点击。 –

回答

4
$("tr.somerow").click(function(e){ 
    var target = $(e.target); // sets to the td or the element that was clicked 
    //do some stuff 
}) 

要查找点击<td>无论任何子元素,使用var target = $(e.target).closest("td");代替。

+2

你为什么删除“最接近”?这是正确的使用 – shesek

+2

你的例子有一个小错误。如果我有'​​锚点'并单击锚文本,它将不会选择'td'。你也需要一个“最接近”的选择器。 –

+2

@shesek,问题是“我可以确定哪个TD('或任何子元素')” – Dogbert

5

如果您可以更改脚本,那么可以利用jquerys .delegate函数。这样可以避免发生多重绑定点击事件,并且在事件处理程序中,此上下文将是单击的td元素的上下文。

$('tr.somerow').delegate('td', 'click', function(){ 

    //this refers to the td 

}) 
+1

这是最好的解决方案,唯一需要注意的是开发人员需要知道的代表将绑定到任何未来的'tr.somerow '被创造出来。 –

+1

@大卫它不会。你现场混淆了它。 – shesek

+0

@shesek “.delegate(selector,eventType,handler)返回:jQuery 描述:基于一组特定的根元素,为现在或未来与选择器匹配的所有元素附加一个处理程序到一个或多个事件“。 “现在或将来” - 委托与现场一样,但它也处理rebinding'this',并且在事件传播中被稍早调用。 http://api.jquery.com/delegate/ –

2

几个主要是正确的答案,但一个错过最接近的,另一个做了很多不必要的错误处理。

$("tr.selector").click(function(e){ 
    var td = $(e.target).closest('td'); 
});