#javascript #html #datatables-1.10
#javascript #HTML #таблицы данных -1.10
Вопрос:
У меня есть этот небольшой код в DataTables.net отвечает за отображение таблицы.
<script>
$(document).ready(function () {
// Setup - add a text input to each header cell
$('#DT-GRvWJTAH thead th').each(function () {
var title = $(this).text();
$(this).html('<input type="text" placeholder="' title '" />');
});
// Setup - add a text input to each footer cell
$('#DT-GRvWJTAH tfoot th').each(function () {
var title = $(this).text();
$(this).html('<input type="text" placeholder="' title '" />');
});
// Table code
var table = $('#DT-GRvWJTAH').DataTable({
"dom": "Bfrtip",
"buttons": [
"copyHtml5",
"excelHtml5",
"csvHtml5",
"pdfHtml5"
],
"colReorder": true,
"paging": true,
"scrollCollapse": false,
"pagingType": [
"full_numbers"
],
"lengthMenu": [
[
15,
25,
50,
100
],
-1,
[
15,
25,
50,
100
],
"All"
],
"ordering": true,
"order": [
],
"info": true,
"procesing": true,
"responsive": {
"details": true
},
"select": true,
"searching": true,
"stateSave": true
});
// Apply the search for header cells
table.columns().eq(0).each(function (colIdx) {
$('input', table.column(colIdx).header()).on('keyup change', function () {
table
.column(colIdx)
.search(this.value)
.draw();
});
$('input', table.column(colIdx).header()).on('click', function (e) {
e.stopPropagation();
});
});
// Apply the search for footer cells
table.columns().every(function () {
var that = this;
$('input', this.footer()).on('keyup change', function () {
if (that.search() !== this.value) {
that.search(this.value).draw();
}
});
});
});
</script>
Полный код здесь: https://codepen.io/przemyslawklys/pen/jRxLRy
Это простая таблица с включенной фильтрацией. Проблема заключается в том, что когда вы фильтруете по какому-либо столбцу и нажимаете F5 для обновления, значение из поля ввода удаляется, но фильтрация остается включенной. Если вы зайдете в этот фильтр и нажмете backspace, он снова начнет работать. Значение есть, просто невидимо.
Теперь в моем Chrome Canary этой проблемы нет, но я вижу ее в других браузерах. Я даже вижу тот же Chrome, когда код размещен в code pen, так что он явно есть.
Как я могу решить эту проблему? Я вижу 2 варианта:
- сделайте так, чтобы фильтр отображался правильно, чтобы пользователь знал
- удалите все фильтры при обновлении
Но как на моем примере я могу это сделать? Я пытался поиграть с ним, но не имел реального успеха.
Ответ №1:
Это потому, что у вас есть
"stateSave": true
Ваша фильтрация столбцов сохраняется вместе со всеми другими настройками, скорее всего, в localStorage, и при нажатии F5 предыдущее состояние восстанавливается. Но у вас нет никакого кода, который заполняет входные saveState
данные условиями поиска ..! Таким образом, вы получаете отфильтрованные данные с пустыми полями ввода.
Вы можете получить / установить saveState
свойства несколькими способами; обработчик событий будет работать с приведенным выше кодом, но вам следует подумать о чем-то более продуманном:
$('#DT-GRvWJTAH').on('stateLoaded.dt', function(e, settings, data) {
settings.aoPreSearchCols.forEach(function(col, index) {
if (col.sSearch) setTimeout(function() {
$('#DT-GRvWJTAH thead th:eq(' index ') input').val(col.sSearch)
}, 50)
})
})
Посмотрите stateSaveParams
/ stateLoadParams
где вы можете установить / получить состояние для ваших входных данных столбца.
Комментарии:
1. Это работает! Спасибо. Есть ли способ отличить ввод в tfoot и thead? Когда я добавил код для обоих, и фильтрация находится в обоих местах при перезагрузке, она заполняет оба места, а не то, в котором на самом деле был настроен фильтр. Хотя оба имеют одинаковую роль, если вы начнете что-то менять в thead, tfoot остается как есть, и поэтому он выглядит плохо. Итак, либо у меня должен быть способ синхронизировать поля ввода, чтобы при вводе чего-либо в thead он отображался как фильтр в tfoot (если он есть), либо каким-то образом иметь разные входные имена?
2. @MadBoy, у вас есть два цикла, заполняющих входные данные для thead и tfoot; у вас может быть один цикл, который заполняет оба, и задает класс по индексу на входных данных, т.е. class=»col3″, при этом вы можете установить как thead, так и tfoot с помощью $(‘input.col3’).val(sSearch) и вы можете проще использовать одни и те же обработчики как для входных данных thead, так и для tfoot.
3. Возможно ли, чтобы вы показали это в моем codepen? Я немного новичок, когда дело доходит до HTML / CSS и JS. Я делаю это в PowerShell (я генерирую код и ставлю галочку). Мои навыки JS близки к 1%: (