【问题标题】:Sum table's colums for every change on table with Javascript使用 Javascript 对表上的每个更改求和表列
【发布时间】:2019-07-12 00:13:02
【问题描述】:

我有一个表格,其中表格数据来自表格。我编写了一个 javascript 函数来对位于 tfoot 的 Value1、Value2 Value3 列求和。

<table id="table1" class="table table-hover table-responsive">
   <thead>
            <tr>

              <th scope="col">Name</th>
              <th scope="col">Value1</th>
              <th scope="col">Value2</th>
              <th scope="col">Value3</th>
              <th scope="col">Info</th>
              <th scope="col">Date</th>
              <th scope="col">Delete</th>

            </tr>
          </thead>

          <tbody id="tbody-list">


          <tr><td>Item1</td>
                    <td>1100</td>
                    <td>10</td>
                    <td>10</td>  
                    <td>Info</td> 
                    <td>2019-02-18</td> 
                    <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr>
<tr><td>Item2 </td>
                    <td>28.00 </td>
                    <td>0.87</td>
                    <td> 0.00 </td>  
                    <td>Info</td> 
                    <td>2019-02-18</td> 
                    <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr><tr><td>Item3 </td>
                    <td>28.00 </td>
                    <td>0.87</td>
                    <td> 0.00 </td>  
                    <td>Info</td> 
                    <td>2019-02-18</td> 
                    <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr><tr><td>Item4 </td>
                    <td>28.00 </td>
                    <td>0.87</td>
                    <td> 0.00 </td>  
                    <td>Info</td> 
                    <td>2019-02-18</td> 
                    <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr></tbody><tfoot>
            <tr><td class="h4">TOTAL Values</td>
            <td id="val1">NaN </td>
            <td id="val2">NaN</td>
            <td id="val3">NaN </td>
            <td></td>
            <td></td>
            <td></td>
          </tr></tfoot>


        </table>

这是我的 js

sumValues(){
    let val1 = parseFloat(document.getElementById('val1').innerHTML);
    let val2 = parseFloat(document.getElementById('val2').innerHTML);
    let val3 = parseFloat(document.getElementById('val3').innerHTML);

    const table = document.getElementById('tbody-list');


    for(let i = 0; i < table.rows.length; i++){
      console.log("works");
      val1 += parseFloat(table.rows[i].cells[1]).innerHTML;
      val2 += parseFloat(table.rows[i].cells[2]).innerHTML;
      val3 += parseFloat(table.rows[i].cells[3]).innerHTML;
    }

    document.getElementById('val1').innerHTML = `${val1}`;
    document.getElementById('val2').innerHTML = `${val2}`;
    document.getElementById('val3').innerHTML = `${val3}`;
}

这是我在 html 中的 tfoot,我将它们设置为 0,val1、val2、val3 的初始值也为 0,然后我可以对其求和。

  <tfoot>
            <td class="h4">TOTAL Values</td>
            <td id="total-cal">0</td>
            <td id="total-car">0</td>
            <td id="total-fat">0</td>
            <td id="total-amount"></td>
            <td></td>
            <td></td>
          </tfoot>

我不知道错误出在哪里,但总价值总是得到 NaN?

另一个问题(与这个问题有关)。这是我的 eventListener ,所以每次表中有一个新项目时,都会调用 sum 函数但后来我意识到当我从表中删除一个项目时这不会启动,是否有我可以使用的事件监听器来启动桌面上的任何更改?

    document.getElementById('tbody-list').addEventListener('DOMNodeInserted',function(){
  const ui = new UI(); 

  ui.sumValues(); 


});

【问题讨论】:

  • 你应该用 0 初始化 val1,2 和 3 你可以试试val1 += Number(table.rows[i].cells[1]).innerText.trim());

标签: javascript html-table sum


【解决方案1】:

您可以将公共类添加到包含 Value1、Value2 Value3 的 td 中。例如,所有具有Value1td 都将具有val1 类,同样td 具有Value2 和Value3

现在你document.getElementsByClassName 将给出一个集合,然后使用数组方法计算总和。要使用数组方法 reduce ,您必须使用 Array.from 将集合转换为数组。

innerHTML 将给出td 内的文本,trim 将删除所有空格。

Array.from(arr).reduce((acc, curr) => { return acc + parseFloat(curr.innerHTML.trim()) }, 0)中的0acc的初始值,所以会像0+1100 +28+28+28

function doSum(arr) {
  console.log(arr)
  return Array.from(arr).reduce((acc, curr) => {
    return acc + parseFloat(curr.innerHTML.trim())
  }, 0)
}


function calValues() {
  let val1Val = doSum(document.getElementsByClassName('val1'));
  let val2Val = doSum(document.getElementsByClassName('val2'));
  let val3Val = doSum(document.getElementsByClassName('val3'))

  document.getElementById('val1').innerHTML = val1Val.toFixed(2);
  document.getElementById('val2').innerHTML = val2Val.toFixed(2);
  document.getElementById('val3').innerHTML = val3Val.toFixed(2);
}
calValues()
<table id="table1" class="table table-hover table-responsive">
  <thead>
    <tr>

      <th scope="col">Name</th>
      <th scope="col">Value1</th>
      <th scope="col">Value2</th>
      <th scope="col">Value3</th>
      <th scope="col">Info</th>
      <th scope="col">Date</th>
      <th scope="col">Delete</th>

    </tr>
  </thead>

  <tbody id="tbody-list">


    <tr>
      <td>Item1</td>
      <td class='val1'>1100</td>
      <td class='val2'>10</td>
      <td class='val3'>10</td>
      <td>Info</td>
      <td>2019-02-18</td>
      <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr>
    <tr>
      <td>Item2 </td>
      <td class='val1'>28.00 </td>
      <td class='val2'>0.87</td>
      <td class='val3'> 0.00 </td>
      <td>Info</td>
      <td>2019-02-18</td>
      <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr>
    <tr>
      <td>Item3 </td>
      <td class='val1'>28.00 </td>
      <td class='val2'> 0.87</td>
      <td class='val3'> 0.00 </td>
      <td>Info</td>
      <td>2019-02-18</td>
      <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr>
    <tr>
      <td>Item4 </td>
      <td class='val1'>28.00 </td>
      <td class='val2'>0.87</td>
      <td class='val3'> 0.00 </td>
      <td>Info</td>
      <td>2019-02-18</td>
      <td>&nbsp; &nbsp;<a href="#" class="delete-item secondary-content"><i class="fa fa-trash"></i></a></td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td class="h4">TOTAL Values</td>
      <td id="val1"></td>
      <td id="val2"></td>
      <td id="val3"></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tfoot>
</table>

【讨论】:

  • 感谢您的精彩回答,我还有一个问题(与此问题有关)。这是我的 eventListener ,因此每次表中有新项目时,求和函数将被调用但后来我意识到当我从表中删除一个项目时这不会启动,是否有一个事件监听器可以用来启动表上的任何更改? document.getElementById('tbody-list').addEventListener('DOMNodeInserted',function(){ const ui = new UI(); ui.sumValues(); });
  • 这是可能的,在我回答之前,如果你能思考会更好,在互联网上搜索并提出一个计划并相信我,这很容易。我猜每一行都会有一个按钮来删除它
  • 已经有一个删除按钮(用于删除项目),我可以在删除按钮的“点击”事件中调用 sum 函数,但是我必须在“DOMNodeInserted”事件中调用它。我想也许有一个事件会引发餐桌上的任何变化。我也尝试了“更改”事件,但没有成功。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多