使用带有表格行与单元格的 JQuery .on 选择器

Posted

技术标签:

【中文标题】使用带有表格行与单元格的 JQuery .on 选择器【英文标题】:Using JQuery .on selector with table rows vs cells 【发布时间】:2014-11-25 14:08:26 【问题描述】:

我找了又找都没用。

我正在创建一个通过 AJAX 显示动态加载内容的网站。所以我的基本 html 有一个空表,并且在加载时添加了 <tr>s。由于<tr>s 在文档加载时不存在,我无法将 JQuery 事件附加到它们,例如$(tr).click(...).

我学会了解决这个问题的答案是做这样的事情:

$(document).ready(function() 
    $('table').on('click', 'tr', function(e) 
        alert('node name = '+e.target.nodeName+', id='+e.target.id);
    );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
    <tr id="rowID">
        <td id="cellID">One</td>
    </tr>
</table>

但是事件返回的目标是TD,而不是TR。那我做错了什么?

我知道我可以通过 e.target.parent.id 解决这个问题,但这很迂回,对我学习没有帮助。

或者这就是它的工作原理?对我来说似乎不对,但也许有人可以启发我?

【问题讨论】:

因为点击的目标是td,然而点击事件是tr。将e.target.nodeName 更改为$(this).prop("tagName"),你就会明白我的意思了 点击事件在行上,但实际目标是你点击的。毫不奇怪 e.target 返回表格单元格。 欢迎使用 jQuery。在元素事件中,您可以使用this 直接引用元素或使用$(this) 将其作为jQuery 对象获取。换句话说this == element event is attached too; this.tagName == $(this).prop("tagName") && this.id == $(this).prop('id') 完美!当然我可以用this!!我在其他事件上使用它,但我从来没有想过我可以将它与这个.on 事件一起使用(可能是因为该事件附加到表上)。我在 Codecademy 上关注示例,他们都使用 e.target.id,而他们本来可以使用 this.id。谢谢大家,尤其是@SpYk3HH,你的解释对我来说是最清楚的。 另外,令人印象深刻的响应时间!向所有相关人员致敬。感谢您的帮助。 【参考方案1】:

您的代码是正确的,这只是您对 event.target 的使用,正如其他人提到的 javascript 冒泡事件的方式,目标始终是您单击的实际项目。

jQuery 为您提供在this 对象或$(this) 中触发点击的元素(如果您需要jQuery 对象)。

【讨论】:

【参考方案2】:

因为 event.target,你可以使用 jQuery(this).prop("tagName") 和 jQuery(this).attr("id") 代替。

$(document).ready(function() 
    $('table').on('click', 'tr', function(e) 
        alert('node name = '+jQuery(this).prop("tagName")+', id='+jQuery(this).attr("id"));
    );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
    <tr id="rowID">
        <td id="cellID">One</td>
    </tr>
</table>

【讨论】:

哦,谢谢。我会从下次开始处理这个。 您可以随时点击编辑按钮并在其中快速解释。 :)【参考方案3】:

javascript冒泡是由内而外的,所以当你点击一系列嵌套元素时,最深的元素是目标,所以基本上是的,你必须使用你提到的方法才能获得 tr 为你的目标。

您可以做的另一件事(但不是在您的情况下)是用您想要成为目标的元素屏蔽(使用 z-index)您的元素,这样内部元素就不会被点击,并且外部元素是实际被点击的元素。

我需要补充的另一件事(正如其他人在 cmets 中所说)是您可以使用 this 或 jQuery 方式 $(this)

【讨论】:

【参考方案4】:

TD 是目标,因为我们实际上是在点击它...在 Javascript 中,点击事件绑定到父级,而子级会受到影响。因此,当您单击 td 时,他的父级会触发该事件。

【讨论】:

没有。他所要做的就是使用this.id$(this).prop('id')

以上是关于使用带有表格行与单元格的 JQuery .on 选择器的主要内容,如果未能解决你的问题,请参考以下文章

当我向下滚动表格视图时,隐藏单元格的复选标记消失了

设置静态表格视图单元格的复选标记

使用jQuery更改表格单元格的背景颜色

在电子表格中使用带有日期时间单元格的查询

我想使用带有多个单元格的表格视图,一个单元格有多个列,2 个单元格只有一列

带有空单元格的表格视图