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

Есть скрипт библиотеки 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
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088075
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
Подскажите, что нужно ещё сделать, чтобы используемая библиотека применилась уже к обновленному tbody таблицы?

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

В любом случае ты должен решать когда запускать свой скрипт.
...
Рейтинг: 0 / 0
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088091
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088104
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir , тут я тебе не помощник... С этим не работал, х/з чего там будет нужно.
...
Рейтинг: 0 / 0
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088121
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa, спасибо за помощь!
Может кто-то уже сталкивался с подобной проблемой
...
Рейтинг: 0 / 0
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088151
Фотография 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
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088159
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, АПИ этой штучки почитать?
...
Рейтинг: 0 / 0
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088488
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
    #40088489
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
9 сообщений из 9, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Как перезапустить JS скрипт для таблицы table из библиотеки после обновления tbody таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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