HTML Таблица фильтрации / выбора - PullRequest
1 голос
/ 25 февраля 2020

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

.append($table.find('tbody tr')

<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="/stylesheets/style.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
    <meta charset="utf-8">
    <title>Filter</title>




</head>

<script>
    $.ajax({
        url: 'http://localhost:7003/getTable',
        type: "get",
        dataType: "json",

        success: function(data) {
            drawTable(data);
        }
    });

    function drawTable(data) {
        for (var i = 0; i < data.length; i++) {
            drawRow(data[i]);
        }
    }

</script>




</body>
</html>



<table id="myTable" class="table table-striped">

  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th class="dropdown-header">Age</th>
      <th>Email</th>
      <th class="dropdown-header">Gender</th>
      <th class="dropdown-header">Term</th>
      <th class="dropdown-header">Enrolled</th>
    </tr>
  </thead>

  <tbody>

    <script>

        function drawRow(rowData) {
            var row = $("<tr />")
            $("#myTable").append(row);
                row.append($('<td>' + rowData.County + '</td>')); 
                row.append($('<td>' + rowData.County + '</td>')); 
                row.append($('<td>').attr('data-field-name', 'age').text(rowData.County));
                row.append($('<td>' + rowData.County + '</td>')); 
                row.append($('<td data-field-name="gender">' + rowData.County + '</td>')); 
                row.append($('<td data-field-name="term">' + rowData.County + '</td>')); 
                row.append($('<td data-field-name="enrolled">' + rowData.County + '</td>')); 



            }
    </script>

    <tr>
      <td>John</td>
      <td>Smith</td>
      <td data-field-name="age">15</td>
      <td>123</td>
      <td data-field-name="gender">Male</td>
      <td data-field-name="term">Summer2017</td>
      <td data-field-name="enrolled">Fall2018</td>
    </tr>
    <tr>
      <td>Jane</td>
      <td>Doe</td>
      <td data-field-name="age">16</td>
      <td>456</td>
      <td data-field-name="gender">Female</td>
      <td data-field-name="term">Fall2018</td>
      <td data-field-name="enrolled">Fall2019</td>
    </tr>
    <tr>
      <td>Bobby</td>
      <td>Adams</td>
      <td data-field-name="age">15</td>
      <td>789</td>
      <td data-field-name="gender">Male</td>
      <td data-field-name="term">Spring2019</td>
      <td data-field-name="enrolled">Fall2018</td>
    </tr>
    <tr>
      <td>Sarah</td>
      <td>Lee</td>
      <td data-field-name="age">15</td>
      <td>456</td>
      <td data-field-name="gender">Female</td>
      <td data-field-name="term">Fall2018</td>
      <td data-field-name="enrolled">Fall2018</td>
    </tr>
  </tbody>
</table>

<script>
    (function($) {
  $.fn.tableFilterHeaders = function(filterFn) {
    this.each((index, header) => {
      let $header = $(header),
          $table = $header.closest('table'),
          text = $header.text(),
          colIndex = $header.closest('th').index(),
          fieldName = $header.attr('data-field-name') || text.toLowerCase(),
      $select = $('<select>')
        .data('fieldName', fieldName)
        .append($('<option>').text(text).val('').prop('disabled', true))
        .append($('<option>').text('All').val('all'))
        .append($table.find('tbody tr')
          .toArray()
          .map(tr => {
            return $(tr).find(`td:eq(${colIndex})`).text();
          })
          .filter(text => text.trim().length > 0)
          .sort()
          .filter((v, i, a) => a.indexOf(v) === i)
          .map(text => {
            return $('<option>').text(text).val(text);
          }));
      $header.empty().append($select.val('').on('change', filterFn));
    });
  };
  $.fn.initRowClasses = function(oddCls, evenCls) {
    this.find('tbody tr').each(function(i) {
      $(this).toggleClass(oddCls, i % 2 == 0).toggleClass(evenCls, i % 2 == 1);
    });
  };
  $.fn.updateRowClasses = function(oddCls, evenCls) {
    this.find('tbody tr:visible:even').addClass(oddCls).removeClass(evenCls);
    this.find('tbody tr:visible:odd').addClass(evenCls).removeClass(oddCls);
  };
})(jQuery);

$('#myTable').initRowClasses('odd', 'even');
$('.dropdown-header').tableFilterHeaders(filterText);

function filterText(e) {
  let $filter = $(e.target),
      $table = $filter.closest('table'),
      $filters = $table.find('.dropdown-header select'),
  filterObj = $filters.toArray().reduce((obj, filter) => {
    let $filter = $(filter);
    return Object.assign(obj, { [$filter.data('fieldName')] : $filter.val() });
  }, {});
  if ($filter.val() === 'all') {
    $filter.val('')
  }
  $table.find('tbody tr').each(function() {
    $(this).toggle($(this).find('td').toArray().every(td => {
      let $td = $(td), fieldName = $td.attr('data-field-name');
      if (fieldName != null) {
        return filterObj[fieldName] === null ||
          filterObj[fieldName] === '' ||
          filterObj[fieldName] === 'all' ||
          filterObj[fieldName] === $td.text();
      }
      return true;
    }));
  });

  $table.updateRowClasses('odd', 'even');
}
</script>


enter image description here

Не отображается да и нет вариантов.

enter image description here

1 Ответ

1 голос
/ 25 февраля 2020

Ваши логи фильтрации c и логи нечетных / четных строк c называются ДО данные возвращаются из вашего ajax, даже если они появляются ПОСЛЕ на странице /код. Вот как работают асин c методы.

Вам нужно вызвать заголовок и раскрашивать логи c внутри функции drawTable() после того, как, конечно, вы закончили рисовать таблицу ... вот так :

function drawTable(data) {
   for (var i = 0; i < data.length; i++) {
      drawRow(data[i]);
   }

   $('#myTable').initRowClasses('odd', 'even');
   $('.dropdown-header').tableFilterHeaders(filterText);
}

Убедитесь, что удалили следующие 2 строки кода:

$('#myTable').initRowClasses('odd', 'even');
$('.dropdown-header').tableFilterHeaders(filterText);

из вашего кода, где бы они ни появлялись. Оставив их, ничего не сломается, просто будет запускаться несколько раз без необходимости.

...