Гость
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы / 9 сообщений из 9, страница 1 из 1
03.08.2021, 08:07
    #40088065
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Здравствуйте!

Есть скрипт библиотеки http://cdn.datatables.net/plug-ins/, который добавляет фильтры и сортировщики для таблицы:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
$(document).ready(function () {
    $('#friendTable').DataTable({
 
        retrieve: true,
        paging: false,
        //ajax: '/ajax/arrays.txt',
        language: {
            url: "http://cdn.datatables.net/plug-ins/1.10.20/i18n/Russian.json"
        },
 
        initComplete: function () {
            this.api().columns([6,8,13,14,19,21]).every(function () {
                var column = this;
                var select = $('<select><option value="">Все</option></select>')
                    .appendTo($($(column.header()))) //$(column.footer().empty())
                    .on('change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );
 
                        column
                            .search(val ? '^' + val + '$' : '', true, false)
                            .draw();
                    });
 
                $(select).click(function (e) {
                    e.stopPropagation();
                });
 
                column.data().unique().sort().each(function (d, j) {
                    if (column.search() === '^' + d + '$') {
                        select.append('<option value="' + d + '" selected="selected">' + d.substr(0, 30) + '</option>')
                    } else {
                        select.append('<option value="' + d + '">' + d.substr(0, 30) + '</option>')
                    }
                });
            });
        }
    });
});



В процессе, тело таблицы (tbody), к которой применяется скрипт обновляется, и после обновления tbody фильтры, которые добавляются вышеописанной функцией и библиотекой не обновляются, и сортировщики строк перестают работать.

Функция обновления tbody:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
$(function () {
    $("#SelectElectoralDistrictId").change(function () {
        var formData = { 'IdElectoralDistrict': Number.parseInt($('#SelectElectoralDistrictId').val()), 'Name': $('#SelectElectoralDistrictId>option:selected').text() };
        $('#' + 'friendTable' + ' tbody > tr').remove();
 
        $.ajax({
            type: 'POST',
            //    url: '@Url.Action("GetPolingStationsByElectoralDistrict")',
            url: 'Admin/SearchFriendsByElectoralDistrict/',
            headers:
            {
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            data: JSON.stringify(formData),
            success: function (data) {
 
                $('#TbodyFriendTable').replaceWith(data);
                updatingFields('friendTable', 'numberRecords');
 
                // Генерация события для элемента FriendTable
                let elemFriendTable = document.querySelector('#friendTable')
                const eventChange = new Event("change");
                elemFriendTable.dispatchEvent(eventChange);
            },
            error: function (result, status, er) {
                alert('error: ' + result + ' status: ' + status + ' er:' + er);
            }
        });
    });
});



Сгенерировал в методе обновления tbody событие изменения для данной таблицы, но это не помогло - на изменение tbody не реагирует:

Код: javascript
1.
2.
3.
4.
/ Генерация события для элемента FriendTable
                    let elemFriendTable = document.querySelector('#friendTable')
                    const eventChange = new Event("change");
                    elemFriendTable.dispatchEvent(eventChange);



Пробовал создать обработчик только только на тело tbody таблицы, но это тоже не сработало:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
$('#friendTable tr td').on('DOMSubtreeModified', function () {
 
    $('#friendTable').DataTable({
 
        retrieve: true,
        paging: false,
        language: {
            url: "http://cdn.datatables.net/plug-ins/1.10.20/i18n/Russian.json"
        },
 
        initComplete: function () {
            this.api().columns([6, 8, 13, 14, 19, 21]).every(function () {
                var column = this;
                var select = $('<select><option value="">Все</option></select>')
                    .appendTo($($(column.header()))) //$(column.footer().empty())
                    .on('change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );
 
                        column
                            .search(val ? '^' + val + '$' : '', true, false)
                            .draw();
                    });
 
                $(select).click(function (e) {
                    e.stopPropagation();
                });
 
                column.data().unique().sort().each(function (d, j) {
                    if (column.search() === '^' + d + '$') {
                        select.append('<option value="' + d + '" selected="selected">' + d.substr(0, 30) + '</option>')
                    } else {
                        select.append('<option value="' + d + '">' + d.substr(0, 30) + '</option>')
                    }
                });
            });
        }
    });
});



Тогда срабатывает при загрузки страницы, а при изменении тела таблицы нет.

Подскажите, что нужно ещё сделать, чтобы используемая библиотека применилась уже к обновленному tbody таблицы?
...
Рейтинг: 0 / 0
03.08.2021, 08:48
    #40088075
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Vlad__i__mir
Подскажите, что нужно ещё сделать, чтобы используемая библиотека применилась уже к обновленному tbody таблицы?

Вариантов решения наверняка несколько... Вот тебе парочка
- Оформить всю обработку в виде "именной" функции и вызывать ее когда нужно.
- Использовать свое "синтетическое" событие и генерить его по мере надобности.

В любом случае ты должен решать когда запускать свой скрипт.
...
Рейтинг: 0 / 0
03.08.2021, 09:36
    #40088091
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
krvsa
Vlad__i__mir
Подскажите, что нужно ещё сделать, чтобы используемая библиотека применилась уже к обновленному tbody таблицы?

Вариантов решения наверняка несколько... Вот тебе парочка
- Оформить всю обработку в виде "именной" функции и вызывать ее когда нужно.
- Использовать свое "синтетическое" событие и генерить его по мере надобности.

В любом случае ты должен решать когда запускать свой скрипт.


Сделал в виде именной функции:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function UpdateTablePlagin () {

    $('#friendTable').DataTable({
        retrieve: true,
        paging: false,
        language: {
            url: "http://cdn.datatables.net/plug-ins/1.10.20/i18n/Russian.json"
        },

        initComplete: function () {
            this.api().columns([6, 8, 13, 14, 19, 21]).every(function () {
                var column = this;
                var select = $('<select><option value="">Все</option></select>')
                    .appendTo($($(column.header()))) //$(column.footer().empty())
                    .on('change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );

                        column
                            .search(val ? '^' + val + '$' : '', true, false)
                            .draw();
                    });

                $(select).click(function (e) {
                    e.stopPropagation();
                });

                column.data().unique().sort().each(function (d, j) {
                    if (column.search() === '^' + d + '$') {
                        select.append('<option value="' + d + '" selected="selected">' + d.substr(0, 30) + '</option>')
                    } else {
                        select.append('<option value="' + d + '">' + d.substr(0, 30) + '</option>')
                    }
                });
            });
        }
    });
};



Вызываю её после обновления tbody:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
success: function (data) {

                $('#TbodyFriendTable').replaceWith(data);
 
                UpdateTablePlagin();

            },



В функцию заходит, но после строки
Код: javascript
1.
 $('#friendTable').DataTable({

, сразу переходит к концу функции и фильтры у таблицы не обновляются и не работают.
Как-будто он не может обновить данные фильтров и другое из обновленного tbody
...
Рейтинг: 0 / 0
03.08.2021, 09:52
    #40088104
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Vlad__i__mir , тут я тебе не помощник... С этим не работал, х/з чего там будет нужно.
...
Рейтинг: 0 / 0
03.08.2021, 10:29
    #40088121
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
krvsa, спасибо за помощь!
Может кто-то уже сталкивался с подобной проблемой
...
Рейтинг: 0 / 0
03.08.2021, 11:48
    #40088151
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Vlad__i__mir , выскажу предположение...
Возможно все дело в асинхронности обновления твоего тбоди. Попробуй свою функцию вызвать с некой задержкой (в качестве эксперимента).

Vlad__i__mir
Вызываю её после обновления tbody:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
success: function (data) {

                $('#TbodyFriendTable').replaceWith(data);
 
                UpdateTablePlagin();

            },


Вот так

Код: javascript
1.
2.
3.
4.
success: function (data) {
      $('#TbodyFriendTable').replaceWith(data);
      setTimeout(UpdateTablePlagin, 3000);
},
...
Рейтинг: 0 / 0
03.08.2021, 12:12
    #40088159
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Может, АПИ этой штучки почитать?
...
Рейтинг: 0 / 0
04.08.2021, 09:05
    #40088488
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
ShSerge
Может, АПИ этой штучки почитать?


Вот, я почитал и сделал как там описано
1) Удалил все строки из tbody с помощью АПИ этой библиотеки
Код: javascript
1.
2.
var friendDataTable = $('#friendTable').DataTable();
friendDataTable.rows().remove().draw();


2) уничтожил объект DataTable
Код: javascript
1.
friendDataTable.destroy();


3) далее загружаю новые строки
Код: javascript
1.
$('#TbodyFriendTable').replaceWith(data);


4) произвел новую инициализацию объекта DataTable:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
success: function (data) {

                // Delete rows
                var friendDataTable = $('#friendTable').DataTable();
                friendDataTable.rows().remove().draw();
                // Destroy object DataTable
                friendDataTable.destroy();
                //$('#friendTable').empty();

                // Update tbody new rows with data
                $('#TbodyFriendTable').replaceWith(data);
                updatingFields('friendTable', 'numberRecords');

                UpdateTablePlagin();
            },


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
function UpdateTablePlagin () {

    $('#friendTable').DataTable({

        retrieve: true,
        paging: false,
        language: {
            url: "http://cdn.datatables.net/plug-ins/1.10.20/i18n/Russian.json"
        },

        initComplete: function () {
            this.api().columns([1,2,4]).every(function () {
                var column = this;
                var select = $('<select><option value="">Все</option></select>')
                    .appendTo($($(column.header()))) //$(column.footer().empty())
                    .on('change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );

                        column
                            .search(val ? '^' + val + '$' : '', true, false)
                            .draw();
                    });

                $(select).click(function (e) {
                    e.stopPropagation();
                });

                column.data().unique().sort().each(function (d, j) {
                    if (column.search() === '^' + d + '$') {
                        select.append('<option value="' + d + '" selected="selected">' + d.substr(0, 30) + '</option>')
                    } else {
                        select.append('<option value="' + d + '">' + d.substr(0, 30) + '</option>')
                    }
                });
            });
        }
    });
};



Она вроде как про инициализировалась с новыми данными, но старые данные тоже остались. Теперь 2 фильтра с новыми и старыми данными и сортировщик не понятно как работает
...
Рейтинг: 0 / 0
04.08.2021, 09:08
    #40088489
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
krvsa
Vlad__i__mir , выскажу предположение...
Возможно все дело в асинхронности обновления твоего тбоди. Попробуй свою функцию вызвать с некой задержкой (в качестве эксперимента).

Vlad__i__mir
Вызываю её после обновления tbody:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
success: function (data) {

                $('#TbodyFriendTable').replaceWith(data);
 
                UpdateTablePlagin();

            },


Вот так

Код: javascript
1.
2.
3.
4.
success: function (data) {
      $('#TbodyFriendTable').replaceWith(data);
      setTimeout(UpdateTablePlagin, 3000);
},



Тут что-то с самой библиотекой по ходу связано. Я АПИ её почитал, сделал как там описано, но теперь у меня данные и старые и новые в фильтрах. Что с этим делать не понятно
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]