【问题标题】:How to calculate the difference of two values in a <td> tag in another <td> tag in HTML如何计算HTML中另一个<td>标签中一个<td>标签中两个值的差异
【发布时间】:2021-10-18 10:00:01
【问题描述】:

我有一个 HTML 表格,它被渲染,就像,

{% for element in combined_list %}
<td id='first'>element.first</td>
<td id='second'>element.second</td>
<td id='diff>I want the difference of first and second here</td>
{% endfor %}

我也尝试过使用 jQuery:

jQuery(document).ready(function($) {
        let first_= jQuery('#first','/^[0-9]*$/' ).text();
        let second_ = jQuery('#second').html();
        let diff = first_- second_ ;
            $('#diff').html(diff)
                      
    });

但我只得到一栏。提前致谢。

【问题讨论】:

  • 从您的示例中的 jQuery 选择器中删除正则表达式,代码应该可以正常工作 - 假设两个值都是数字。如果它不适合您,请编辑问题以包含 actual HTML 以及正在使用的值的演示,以及输出应该是什么。
  • 我想添加正则表达式以仅获取数字,因为表中的值具有单位 (kg)。我尝试删除它仍然只获得一列的价值。有没有办法在这里使用正则表达式?
  • 当然,但是正则表达式采用的形式取决于您的 HTML。您甚至可以简单地使用parseInt()
  • 所以这个问题根本与 Django 无关。请点击edit,然后点击[&lt;&gt;],然后使用RENDERED HTML 和JS 以及相关的CSS 和jQuery 发布minimal reproducible example
  • 另外,您在第二个 id 中有错字 - 缺少引号和 ID 需要是唯一的,因此使用一个类并且您拥有所有第一列,您可以通过 .closest 使用相对寻址来获取另一个列

标签: javascript html jquery django-2.1


【解决方案1】:
  • 您在第二个 ID 中有错字 - 缺少引号
  • ID 必须是唯一的,因此请改用一个类,您可以遍历所有前列
  • 您可以通过 .next 和/或 .closest 使用相对寻址来获取其他列

$(function() {
  $("#tb .first").each(function() {
    const val1 = +$(this).text();
    const val2 = +$(this).next().text();
    $(this).closest("tr").find(".diff").text(val1 - val2);
  })
})
td {
  border: 1px solid black;
  padding: 3px;
  text-align: right;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <th>1st</th>
      <th>2nd</th>
      <th>Diff</th>
    </tr>
  </thead>
  <tbody id="tb">
    <tr>
      <td class="first">11</td>
      <td class="second">9</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">12</td>
      <td class="second">8</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">13</td>
      <td class="second">7</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">14</td>
      <td class="second">6</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">15</td>
      <td class="second">5</td>
      <td class="diff"></td>
    </tr>
  </tbody>
</table>

纯 JS

window.addEventListener('load', function() {
  [...document.querySelectorAll('#tb .first')].forEach(cell => {
    const parent = cell.closest('tr');
    const val1 = +cell.textContent;
    const val2 = +parent.querySelector('.second').textContent;
    parent.querySelector('.diff').textContent = val1 - val2;
  })
})
td {
  border: 1px solid black;
  padding: 3px;
  text-align: right;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <th>1st</th>
      <th>2nd</th>
      <th>Diff</th>
    </tr>
  </thead>
  <tbody id="tb">
    <tr>
      <td class="first">11</td>
      <td class="second">9</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">12</td>
      <td class="second">8</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">13</td>
      <td class="second">7</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">14</td>
      <td class="second">6</td>
      <td class="diff"></td>
    </tr>
    <tr>
      <td class="first">15</td>
      <td class="second">5</td>
      <td class="diff"></td>
    </tr>
  </tbody>
</table>

【讨论】:

    【解决方案2】:

    您不能有多个具有相同 id 的列,请改用类

    $(document).ready(function(){
      
      var rows = document.getElementById("table").getElementsByTagName("tr");
      
      for(var i = 0; i < rows.length; i++)
      {
        var first = parseInt(rows[i].getElementsByClassName("first")[0].textContent);
        var second = parseInt(rows[i].getElementsByClassName("second")[0].textContent);
        var diff = first - second;
        
        console.log("First: "+first+" - second : "+second+" = "+diff);
    
        rows[i].getElementsByClassName("diff")[0].textContent = diff;
      }
    
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <table id='table'>
    <tr>
    <td class='first'>5</td>
    <td class='second'>4</td>
    <td class='diff'>diffhere</td>
    </tr>
    <tr>
    <td class='first'>9</td>
    <td class='second'>3</td>
    <td class='diff'>diffhere</td>
    </tr>
    </table>

    【讨论】:

    • document.ready 比仅仅 load / DOMContentLoaded 事件要完整得多,此外 byClassName、byTagName 等。性能比 querySelector / querySelectorAll O(1) vs O(n) 好得多,但我同意innerHTML 在这种情况下这不是最好的方法:) 但这当然只是你可以忽略的观点;D
    • 哈哈没有人知道 OP 可能来自 Google 试图为 10 亿行表找到解决方案:D
    • 显然有人非常不同意我的观点,我被否决了,而你被投了赞成票!?
    • 因此,对于 4 行 jsbench.me/f1kselbfka/1,您的解决方案比我的解决方案慢 85%,在 3000 行时慢 99%
    • 哈哈,我考虑到您对 textContent 与 innerHTML 的评论,现在我的更快了:p
    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多