Динамические кнопки не открывают модальные в jQuery

#jquery #datatables #modal-dialog

#jquery #таблицы данных #модальный диалог

Вопрос:

У меня есть панель с вкладками, на каждой панели есть список таблиц данных с кнопками для редактирования или удаления каждой отдельной строки в таблицах. Под изображением первой панели сразу после загрузки страницы рабочая первая панель с вкладками

Ниже на другой панели, выбранной Другая панель не работает

Каждая кнопка редактирования действий должна открывать модальную форму для редактирования данных строк в таблицах данных, но они не работают. Я имею в виду, что просто кнопка редактирования действий на первой базовой панели работает нормально…кнопки на другой панели с вкладками не открывают модальные. Только кнопка Добавить серую в каждой панели может открыть модальную … и я думаю, что это связано с тем, что серые кнопки «Добавить» являются статическими … не динамически создаваемыми вызовом AJAX, как строки в таблицах данных.

Я схожу с ума, чтобы понять, как можно исправить эту странную проблему.

Ниже HTML-код для создания страницы (просто фрагмент HTML для каждой панели с вкладками):

 <!-- Register pane content -->
<div class="tab-pane" id="register-tab">
    <div class="row">
        <div class="col-md-12">
            <div class="table-responsive">
                <table class="table table-sm table-bordered mb-0" id="register-table">
                    <thead class="thead-light">
                        <tr>
                            <th>Registration</th>
                            <th>CofR</th>
                            <th>From</th>
                            <th>To</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                        
                    </tbody>
                </table>
            </div>
            <hr>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12 text-right">
        <button type="button" id="add-registration-button" class="btn btn-secondary btn-sm waves-effect waves-light mt-2">Add Registration</button>
        </div>
    </div>
</div>
 

Код jQuery для загрузки таблицы данных выглядит следующим образом:

 //Ajax datatables
var registerTable = $('#register-table').DataTable({ 
    responsive: true,
    autoWidth: false,
    searchDelay: 500,
    processing: true,
    serverSide: true,
    stateSave: true,
    paging: false,
    ordering: false,
    info: false,
    searching: false,
    ajax: {
        url: controller_url   '/get_aircraft_registrations/'   aid,
        type: "GET",
    },
    columns:  [
        { data: "registration" },
        { data: "cor" },
        { data: "registerDate" },
        { data: "cancDate" },
        { data: "action", responsivePriority: -1 },
    ], 
    createdRow: function ( row, data, index ) {
        $( row ).find('td:eq(3)').attr('data-id', data.id);
    },
    columnDefs: [
        {
            targets: -1,
            title: 'Actions',
            orderable: false,
            searchable: false,
            render: function(data, type, full, meta) {
                return `
                <td>
                    <div class="button-list">
                    <button type="button" class="btn btn-xs btn-info waves-effect waves-light"><i class="mdi mdi-pencil edit-registration"></i></button>
                    <button type="button" class="btn btn-xs btn-danger waves-effect waves-light"><i class="mdi mdi-close remove-registration"></i></button>
                    </div>
                </td>`;
            },
        },
        {
            targets: [ 1, 2, 3 ],
            orderable: false,
            searchable: false,
        },
    ],
});
 

Я думаю, что наиболее важной частью кода jQuery является следующая: открывать модальные при нажатии каждой кнопки

 $("body").on("click",".button-list .actions",function(e){
    var $btn = $(this);
    
    var id = $btn.closest('td').data('id');
    
    if(id != null) {
        e.preventDefault();
       
        if($btn.hasClass("edit-base")) {
            console.log('you want to edit base with id '   id);
            editBase(id);
        }
       
        if($btn.hasClass("remove-base")) {
            console.log('you want to remove base with id '   id);
            deleteBase(id);
        }
    }
});

function editBase(id){
    console.log(`Editing base with id ${id}`);
   
    $('#baseModal').modal('show');
}
 

Большое спасибо за помощь

Ответ №1:

Попробуйте добавить InitComplete при инициализации datatable.

 "initComplete":function( settings, json){
    $("body").on("click",".button-list .actions",function(e){
       var $btn = $(this);
    
       var id = $btn.closest('td').data('id');
    
       if(id != null) {
          e.preventDefault();
       
          if($btn.hasClass("edit-base")) {
            console.log('you want to edit base with id '   id);
          }
       
          if($btn.hasClass("remove-base")) {
            console.log('you want to remove base with id '   id);
          }
       }
    });
 }
 

Вы можете поместить свою функциональность нажатия кнопки в InitComplete, чтобы после рендеринга всех данных в таблице данных она инициализировалась рядом с кнопкой.

Комментарии:

1. Большое спасибо за неоценимую помощь. Исправлена проблема