Как сложить отфильтрованную таблицу HTML? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть таблица HTML, которую я могу фильтровать с помощью jquery.Внизу моей таблицы я хочу иметь строку «итого», которая суммирует все отображаемые значения.Сумма, отображаемая в строке «итого», должна быть суммой всех отображаемых строк, т.е. не учитывать скрытые строки.

Я попытался добавить условие, подобное суммированию которого зависит от стиля отображения:ряд, однако это не сработало.Есть ли простое решение для реализации этого?Как простой JavaScript, если условие, которое проверяет, является ли строка, частью которой является элемент td, скрыто или нет?

РЕДАКТИРОВАТЬ: Мои HTML-Coods выглядят так (функция javascript, которая вычисляетитоговое значение столбца указывается после таблицы):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>

 <link rel="stylesheet" href="css2/bootstrap.css" />
 <link rel="stylesheet" href="css2/dataTables.bootstrap.min.css" />
 <link rel="stylesheet" href="css2/responsive.bootstrap.min.css" type="text/css" />
 <link rel="stylesheet" href="css2/buttons.bootstrap.min.css" type="text/css" />
 <link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="container-fluid" style="width:80%;">
<table id=datatable class="datatable table table-hover">
  <thead>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Address</th>
      <th>Class</th>
        <th>Class</th>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <th>
         <input type="text" class="form-control input-sm filter-column" placeholder="nach ID filtern"> 
        </th>
      <th>
        <input type="text" class="form-control input-sm filter-column"> 
      </th>
      <th>
        <input type="text" class="form-control input-sm filter-column" />
      </th>
      <th>
        <select class="form-control input-sm filter-column">
          <option value="A">A</option>
          <option value="B">B</option>
          <option value="B">C</option>
        </select>
      </th>
          <th>
        <select class="form-control input-sm filter-column">
          <option value="A">A</option>
          <option value="B">B</option>
          <option value="B">C</option>
        </select>
      </th>
    </tr>
  </tfoot>
  <tbody> 
 <tr>
<td>1</td> 
<td>bla</td> 
<td>500</td> 
<td>100%</td> 
<td>300</td> 
</tr> 
</tbody>
    <tfoot>
     <tr class="sum-row">
  <td id=data0></td> 
  <td id=data1></td> 
  <td id="data2">0</td> 
   <td id="data3">0</td>
    <td id="data4">0</td> 
</tr> 
  </tfoot>
</table>

</div> 
<script language="javascript" type="text/javascript">
var columnCount = document.getElementById('datatable').rows[2].cells.length;`
var tds = document.getElementById('datatable').getElementsByTagName('td');
var sum = 0;

var columnsToSum = [3,4];

for (i=0; i<columnsToSum.length;i++) {
            a = columnsToSum[i];            
            sum=0;
            var hasPercent = false;
        for(z = columnsToSum[i]; z < tds.length; z+=columnCount) {

sum += isNaN(tds[z].innerHTML) ? 0 : parseInt(tds[z].innerHTML); 

}
 document.getElementById("data"+ a).innerHTML = sum;                             
}
</script>
<script src="js2/jquery-1.11.3.min.js"></script>
<script src="js2/jquery.dataTables.min.js"></script>
<script src="js2/dataTables.bootstrap.min.js"></script>
<!-- Responsive extension -->
<script src="js2/responsive.bootstrap.min.js"></script>
<!-- Buttons extension -->
<script src="js2/dataTables.buttons.min.js"></script>
<script src="js2/buttons.bootstrap.min.js"></script>
<script src="js2/jszip.min.js"></script>
<script src="js2/buttons.html5.min.js"></script>          

Приведенный выше код всегда показывает общую сумму всех значений в таблице и не учитывает фильтрацию.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Я думаю, этот код будет работать.

$(document).ready(function () {
    var table = $('#datatable').DataTable();
    calculatesum(table.rows().nodes());
    $('input').on('keyup click', function () {
        var searched = table.rows({
            search: 'applied'
        }).nodes();

        calculatesum(searched);

    });
});

function calculatesum(all) {
    var columnsToSum = [2, 4];
    for (i = 0; i < columnsToSum.length; i++) {
        a = columnsToSum[i];
        sum = 0;
        for (j = 0; j < all.length; j++) {

            var val = all[j].getElementsByTagName('td')[a].innerHTML;
            sum += isNaN(val) ? 0 : parseInt(val);


        }
        document.getElementById("data" + a).innerHTML = sum;
    }
}
0 голосов
/ 04 июля 2019

Вы можете запросить DOM и отфильтровать по attr следующим образом:

Array
.from(document.querySelectorAll('table#datatable td')) // Or some other selector you wish
.filter(r=>r.hidden) // Enter here your filter func. Can also filter by `r.style.display` etc.
.reduce((sum, curr)=>sum+(Number(curr.innerHTML) || 0), 0) // Here we try to get the value of the td. If it will resolve to NaN ==> We will return 0 and won't affect the value.

Это даст желаемую сумму.Поместите это значение в любое место:)

Ресурсы:

  1. Array.from ()
  2. Array.prototype.filter ()
  3. Array.prototype.reduce ()
...