Довольно сложно объяснить проблему, надеюсь, вы понимаете, о чем я.

У меня есть еще 1000 данных, отображаемых с помощью таблиц данных jquery, с этим плагином разбивка на страницы будет автоматически создана. В каждую строку я добавляю класс css, чтобы я мог использовать его для каждой строки данных. Через этот класс css я использую для вызова действия javascript в виде диалога. Проблема, на первой странице все идет хорошо, но на второй и последней странице я не смог получить доступ к действию javascript, диалог не появляется, я проверяю console.log, не указывает ничего проблемного.

Это мой код:

HTML

<div id="dialog" title="Select one"></div>

PHP

foreach ($datafromDb as $data) {
    $datakey = '{"dataCode":"'.$data['dataCode'].'"}';
    echo "<td><a href='#' class='cssClass' data-key='" . $datakey . "'>Click</a></td>";
}

Javascript

$(document).ready(function () {
   // implement jquery dataTables
   $('#table').DataTable({
        bAutoWidth: false,
        stateSave: true
   });

   // this action executed when cssClass accessed
   $(".cssClass").click(function () {
        var self = this;

        $("#dialog").dialog({
            resizable: false,
            show: {
                effect: "bounce",
                duration: 500
            },
            hide: {
                effect: "explode",
                duration: 500
            },
            height: 100,
            modal: true,
            buttons: {
                "Button 1": function () {
                    var data = $(self).data('key');
                    window.open("http://www.example.com/" + "firstRoute" + "/" + data.dataCode, "_blank");
                },
                "Button 2": function () {
                    var data = $(self).data('key');
                    window.open("http://www.example.com/" + "secondRoute" + "/" + data.dataCode, "_blank");
                }
            }
        });
    });
}
3
Ugy Astro 24 Июн 2016 в 07:04

4 ответа

Вероятно, это одна из самых распространенных ошибок / проблем DataTables. Фактически настолько, что это второй "самый распространенный FAQ" DataTables. Процитируем Аллана из FAQ по DataTables:

В: Мои мероприятия не работают на второй странице

A. При присоединении событий к ячейкам в таблице, управляемой DataTables, нужно быть осторожным, как это делается. Поскольку DataTables удаляет узлы из модели DOM, события, применяемые с помощью статического прослушивателя событий, могут не иметь возможности связываться со всеми узлами в таблице. Чтобы преодолеть это, просто используйте параметры делегированного прослушивателя событий jQuery, как показано в этом примере.

Я бы рекомендовал взглянуть на этот пример страницы, но чтобы резюмировать то, что в нем говорится: поскольку DataTables добавляет и удаляет строки из DOM по мере необходимости, события могут завершаться ошибкой, особенно на страницах после первой (поскольку они не были на странице при загрузке событий кнопки DataTables).

Чтобы решить эту проблему, используйте прослушиватель событий JQuery on для событий строки. Вы можете использовать вызов DataTables row().data() для получения данных для выбранной / нажатой строки. В вашем случае это, вероятно, будет выглядеть примерно так:

$('#table').on('click', 'tr', function () {
    var data = table.row( this ).data();

    $("#dialog").dialog({
        resizable: false,
        show: {
            effect: "bounce",
            duration: 500
        },
        hide: {
            effect: "explode",
            duration: 500
        },
        height: 100,
        modal: true,
        buttons: {
            "Button 1": function () {
                window.open("http://www.example.com/" + "firstRoute" + "/" + data('key').dataCode, "_blank");
            },
            "Button 2": function () {
                window.open("http://www.example.com/" + "secondRoute" + "/" + data('key').dataCode, "_blank");
            }
        }
    });
});

В качестве побочного примечания, есть ли причина, по которой вы добавляете класс CSS в каждую строку только для вызова событий, а не просто прикрепляете события к самим строкам, как в этом примере?

1
Community 20 Июн 2020 в 12:12
Спасибо за помощь, я наконец нашел способ. Создав скрытый столбец, я могу использовать его для хранения идентификатора / кода, чтобы он не был виден пользователю. К этому скрытому столбцу мы можем получить доступ в соответствии с приведенным вами примером. Я прикрепляю класс CSS к значку, при щелчке не читается вся строка напрямую, а фильтруется классом CSS. Строка будет прочитана при доступе к классу CSS.
 – 
Ugy Astro
27 Июн 2016 в 05:30

В качестве альтернативы вы можете добавить прослушиватель событий в саму таблицу:

$('#table').on("click", ".cssClass", function(){
    var self = this;
    $("#dialog").dialog({
        resizable: false,
        show: {
            effect: "bounce",
            duration: 500
        },
        hide: {
            effect: "explode",
            duration: 500
        },
        height: 100,
        modal: true,
        buttons: {
            "Button 1": function () {
                var data = $(self).data('key');
                window.open("http://www.example.com/" + "firstRoute" + "/" + data.dataCode, "_blank");
            },
            "Button 2": function () {
                var data = $(self).data('key');
                window.open("http://www.example.com/" + "secondRoute" + "/" + data.dataCode, "_blank");
            }
        }
    });
});

Класс cssClass доступен для jQuery только на первой странице, последующие ячейки еще не находятся в DOM, поэтому к ним не будет прикреплен прослушиватель событий. Надеюсь, это поможет.

2
annoyingmouse 24 Июн 2016 в 11:27

Кажется, перерисовать таблицу данных. Так что вам нужно снова связать событие click с функцией. Сначала назначьте свою таблицу данных переменной. Нравится:

var dt = $('#table').DataTable({
    bAutoWidth: false,
    stateSave: true
});

Затем привяжите событие draw и переместите код привязки клика в функцию обратного вызова. Нравится:

dt.on('draw', function() {
   $(".cssClass").click(function () {
       // The callback function.
   });
});

Ссылка: https://datatables.net/manual/events

1
Anson 24 Июн 2016 в 09:25

Например, вам нужно указать идентификатор родительского элемента

$("#example").on("click", "a.cssClass", function () {})
0
Marko Borković 6 Авг 2021 в 16:45