Поле ввода не очищается при обновлении в некоторых браузерах при использовании таблиц данных

#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%: (