【问题标题】:Getting Value From Table TR id and TD id从表 TR id 和 TD id 中获取价值
【发布时间】:2017-01-02 03:55:24
【问题描述】:

我在从表中的 tr 和 td 获取 id 时遇到问题。

假设我有一张这样的桌子:

<table class="table table-hover" id="table_tingkat_jual">
<thead>
 <tr>
   <th>Tingkat Penjualan</th>
   <th>SA</th>
   <th>Kode SA</th>
   <th>Kuantiti Terendah (lusin)</th>
   <th>Kuantiti Tertinggi (lusin)</th>
</tr>
</thead>
<tbody>
 <tr id='0'>
  <td>Diatas Rata-Rata</td>
  <td id='1'>1 </td>
  <td>AG</td>
  <td>3870</td>
  <td>5782</td>
 </tr>
 <tr id='0'>
  <td>Diatas Rata-Rata</td>
  <td id='3'>3 </td>
  <td>CA</td>
  <td>1080</td>
  <td>3780</td>
 </tr>
</tbody>
</table>

我想为在特定表 (table_tingkat_jual) 中单击的每个 tr 从 TR 和 id FROM td 获取 id。

这是我在 jQuery 中的语法:

$('#table_tingkat_jual tr').click(function(){
    this.stopPropagation();
});

$('#table_tingkat_jual tr').click(function() {
    var trid = $(this).closest('tr').attr('id');
    alert("TR ID " + trid);
    var tdid = $(this).closest('td').attr('id');
    alert("TD ID " + tdid);
});

但是当我单击该表中的行时,什么也没发生。我想要的是提醒我 id。 (见警报功能)。

怎么了?

【问题讨论】:

  • 为什么同一个选择器上有两个点击事件?您在几个 tr 上也有相同的 iD...
  • 两个表行有相同的id
  • @n8wrl 哪一个? this.stopPropagation?
  • 尝试自己调试一下。打开控制台,你会看到一些像Object #&lt;HTMLTableRowElement&gt; has no method 'stopPropagation' 这样的错误,这意味着你在一个非jQuery对象上调用了一个jQuery方法。
  • ID 和类不能以数字开头。见这里:stackoverflow.com/questions/70579/…

标签: javascript jquery html html-table


【解决方案1】:

聊天更新:

原来问题在于表格是通过 ajax 动态加载的,所以需要委托事件(除了其他修复):

$(document).on('click', '#table_tingkat_jual tr', function (e) {
    e.stopPropagation();
    var $this = $(this);
    var trid = $this.closest('tr').data('id');
    alert("TR ID " + trid);
    var tdid = $this.find('td[data-id]').data('id');
    alert("TD ID " + tdid);
});

以前的详细信息:

有几个问题,其中最重要的是在 HTML 中使用了重复的 ID(这是无效的)。

您也不需要单独的、相同的选择器来处理stopPropogation(假设您实际上根本需要stopPropogation(例如,为了避免在父对象中单击)。

看来您还想深入了解 TD 值,所以试试这个:

JSFiddle:http://jsfiddle.net/TrueBlueAussie/fw5ty/

$('#table_tingkat_jual tr').click(function(e) {
    e.stopPropagation();
    var $this = $(this);
    var trid = $this.closest('tr').data('id');
    alert("TR ID " + trid);
    var tdid = $this.find('td[data-id]').data('id');
    alert("TD ID " + tdid);
});

data('id')attr('data-id') 的快捷方式。

请注意,我已将您的 HTML 更改为使用 data-id 属性而不是 id=,以便允许重复值。

<table class="table table-hover" id="table_tingkat_jual">
    <thead>
        <tr>
            <th>Tingkat Penjualan</th>
            <th>SA</th>
            <th>Kode SA</th>
            <th>Kuantiti Terendah (lusin)</th>
            <th>Kuantiti Tertinggi (lusin)</th>
        </tr>
    </thead>
    <tbody>
        <tr data-id='0'>
            <td>Diatas Rata-Rata</td>
            <td data-id='1'>1</td>
            <td>AG</td>
            <td>3870</td>
            <td>5782</td>
        </tr>
        <tr data-id='0'>
            <td>Diatas Rata-Rata</td>
            <td data-id='3'>3</td>
            <td>CA</td>
            <td>1080</td>
            <td>3780</td>
        </tr>
    </tbody>
</table>

如果您确实必须使用重复的 ID(我强烈建议您修复),请改用以下代码:

http://jsfiddle.net/TrueBlueAussie/fw5ty/1/

$('#table_tingkat_jual tr').click(function(e) {
    e.stopPropagation();
    var $this = $(this);
    var trid = $this.closest('tr').attr('id');
    alert("TR ID " + trid);
    var tdid = $this.find('td[id]').attr('id');
    alert("TD ID " + tdid);
});

【讨论】:

  • 感谢您的回答,但仍然没有生成警报。
  • @randytan:警报在 JSFiddle 中运行良好......你在哪里点击?
  • 表格中的行。 @TrueBlueAussie
  • 此表是从 Servlet 生成的。然后附加到div中。是不是这个原因?
  • 1.试试我的小提琴并确认它确实按您的预期工作。 2. 您需要更改服务器代码以注入 data-id 而不是 ids 或 3. 在我有 data('id') 的地方使用 attr('id') 并希望您的重复 ID 最好:)
【解决方案2】:

你有两个具有相同 id 的元素:

<tr id='0'>

id 应该是唯一的。如果您希望两者都为 0,请使用一个类,或者为其中一个分配不同的值。

【讨论】:

  • 如果我需要 id 的值仍然相同,是否可以更改 id 属性? @chaoticnadirs
  • 这不是(许多)问题的答案。这是 cmets 的重复。到底谁对此投了赞成票?
  • @randytan 如果您希望它们都具有值“0”,请将 更改为 。您还需要更改 javascript 以查找类而不是 id。
  • 你不建议在类名中使用数字!!!这就是 data- 属性的用途。
  • 数字可以在类名中。只是不是第一个字符
【解决方案3】:

问题是.closest 开始从目标元素向上查找,而不是在 DOM 树上向下查找,并且由于您的事件在 tr 上,它永远不会到达 td,这就是为什么您总是未定义,如果您想要获得第一个tdid,请尝试使用.find()

$('#table_tingkat_jual tr').click(function() {
    var trid = $(this).closest('tr').attr('id');
    alert("TR ID " + trid);
    var tdid = $(this).find('td[id]').attr('id');
    alert("TD ID " + tdid);
});

Sample fiddle

我也想摆脱:

$('#table_tingkat_jual tr').click(function(){
    this.stopPropagation();
});

最后,您不应该在 html 上重复 id 属性,因此您应该更改这些属性或改用数据属性或类。

【讨论】:

  • 嗨,如果我将 id 属性更改为其他内容,例如var 有可能吗?因为当前 id 的值必须是一样的。 (0)
  • @randytan 应该是可能的,只要您的 HTML 上没有重复的 ID
【解决方案4】:

也许你忘记包含 jquery 了? 我刚刚包含了来自 google 的 jQuery,并让脚本等待文档完全加载。

我也给出了不同的 ID,但这不是我认为的问题。

我还建议给所有的 ID,因为现在他会提醒 undefined ID。

对我来说是这样的:

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    $('#table_tingkat_jual tr').click(function() {
    var trid = $(this).closest('tr').attr('id');
    alert("TR ID " + trid);
    var tdid = $(this).closest('td').attr('id');
    alert("TD ID " + tdid);
    });
    });
</script>
</head>
<body>
<table class="table table-hover" id="table_tingkat_jual">
<thead>
 <tr id='0'>
   <th>Tingkat Penjualan</th>
   <th>SA</th>
   <th>Kode SA</th>
   <th>Kuantiti Terendah (lusin)</th>
   <th>Kuantiti Tertinggi (lusin)</th>
</tr>
</thead>
<tbody>
 <tr id='1'>
  <td>Diatas Rata-Rata</td>
  <td id='1'>1 </td>
  <td>AG</td>
  <td>3870</td>
  <td>5782</td>
 </tr>
 <tr id='2'>
  <td>Diatas Rata-Rata</td>
  <td id='3'>3 </td>
  <td>CA</td>
  <td>1080</td>
  <td>3780</td>
 </tr>
</tbody>
</table>
<body>
</html>

希望对你有帮助。

【讨论】:

  • closest 永远不会对 TD 起作用,因为它位于点击的 TR 下方(而非上方)。这就是你得到undefined的原因。
猜你喜欢
相关资源
最近更新 更多
热门标签