【问题标题】:DataTable (CodeIgniter 3 & Bootstrap 4) - Clicking the row action buttons not opening modal [duplicate]DataTable (CodeIgniter 3 & Bootstrap 4) - 单击行操作按钮未打开模式 [重复]
【发布时间】:2022-01-11 03:46:32
【问题描述】:

我正在使用 bootstrap 4 中的 DataTable 并已成功在其上加载数据,但问题是每当我单击行操作按钮(deleteedit)时不打开各自的模态。

这是我的数据表的当前输出:

这是我用于编辑和删除的 DataTable 和 Modals 的 HTML 代码 (index.php)

<div class="col-md-12">
                                <table id="jobtitlesdatatable" class="table table-bordered table-striped">
                                    <thead>
                                        <tr>
                                            <th>#</th>
                                            <th>Job Title</th>
                                            <th>Date Created</th>
                                            <th>Action</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                    </tbody>
                                </table>
</div>
<!-- Edit Job Title Modal -->
<form action="<?= base_url('jobtitle/editJobTitle') ?>" method="post">
    <div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title" id="exampleModalLabel">Edit Job Title</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
            </button>
        </div>
        <div class="modal-body">
         
            <div class="form-group">
                <label>Job Title</label>
                <input type="text" class="form-control job_title" name="job_title" placeholder="Job Title" required>
            </div>
             
        </div>
        <div class="modal-footer">
            <input type="hidden" class="form-control job_id" name="job_id" class="jobID">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            <button type="submit" class="btn btn-primary">Submit</button>
        </div>
        </div>
    </div>
    </div>
</form>
<!-- End Modal Create Job Title -->

<!-- Modal Delete Job Title -->
<form action="<?= base_url('jobtitle/deleteJobTitle') ?>" method="post">
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title" id="exampleModalLabel">Delete Job Title</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
            </button>
        </div>
        <div class="modal-body">
         
           <h4>Are you sure want to delete this Job Title?</h4>
         
        </div>
        <div class="modal-footer">
            <input type="hidden" name="job_id" class="jobID">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
            <button type="submit" class="btn btn-danger">Yes</button>
        </div>
        </div>
    </div>
    </div>
</form>
<!-- End Modal Delete Product-->

这是我的 JQuery 部分 (index.php)

<script>
$(document).ready(function(){
    $('#jobtitlesdatatable').DataTable({
        serverSide: true,
        searching: true,
        ajax: {
            url : "<?php echo base_url("jobtitle/jobtitles_page") ?>",
            type : 'post'
        },
    });
     // get Edit Product
    $('.btn-edit').on('click',function(){
        // get data from button edit
        const id = $(this).data('id');
        const title = $(this).data('name');
        console.log("JOBID: " + id);
        console.log("JOBTITLE: " + title);
        // Set data to Form Edit
        $('.job_id').val(id);
        $('.job_title').val(title);
        // Call Modal Edit
        $('#editModal').modal('show');
    });

    $('.btn-delete').on('click',function(){
        // get data from button edit
        const id = $(this).data('id');
        // Set data to Form Edit
        $('.jobID').val(id);
        // Call Modal Edit
        $('#deleteModal').modal('show');
    });
    
});

这是 Controller 文件中 jobtitles_page() 的代码:

public function jobtitles_page()
 {
      $draw = intval($this->input->get("draw"));
      $start = intval($this->input->get("start"));
      $length = intval($this->input->get("length"));

      $jobtitles =  $this->JobTitleModel->get_all('jobtitle', null);

      $data = array();

      foreach($jobtitles as $jobTitle) {

           $data[] = array(
                $jobTitle->JOBID,
                $jobTitle->JOBTITLE,
                $jobTitle->CREATEDDATE,
                $jobTitle->href = '<a href="#" class="btn btn-warning btn-sm btn-edit" data-id="'.$jobTitle->JOBID.'" data-name="'.$jobTitle->JOBTITLE.'"><span class="fa fa-edit"></span></a>
                <a href="#" class="btn btn-danger btn-delete" data-id="'. $jobTitle->JOBID.'"><span class="fa fa-trash"></span></a>'
           );
      }

      $output = array(
           "draw" => $draw,
             "recordsTotal" => count($jobtitles),
             "recordsFiltered" => count($jobtitles),
             "data" => $data
        );
      echo json_encode($output);
      exit();
 }

当我在开发控制台中检查它的元素时,它会显示:

它正确地传递了 ID 和 JOBTITLE。

可能是什么原因导致此问题以及解决方法是什么?

【问题讨论】:

  • 不要使用直接事件处理程序(例如$('.btn-edit').on('click',function(){...});,而是使用委托事件处理程序:$('tbody').on('click', '.btn-edit', function(){...});。有关讨论和解释,请参阅Direct vs. Delegated - jQuery .on()。基本上,您正在尝试附加事件到页面中(尚)不存在的东西 - 要么是因为 DataTable 仍在初始化过程中,要么您正在访问表结果的后续页面。

标签: javascript jquery bootstrap-4 datatables codeigniter-3


【解决方案1】:

正如@andrewJames 评论的那样,您正在尝试将侦听器附加到尚不存在的元素。您可以根据他们的建议与代表一起去,也可以使用 initComplete,DataTable 中的一个事件。

$(document).ready(function(){
    $('#jobtitlesdatatable').DataTable({
        serverSide: true,
        searching: true,
        ajax: {
            url : "<?php echo base_url("jobtitle/jobtitles_page") ?>",
            type : 'post'
        },
        initComplete: function(settings, json) {
             console.log( 'DataTables has finished its initialisation.' );
             doInit();
         }
    });   
});

function doInit() {
     // get Edit Product
    $('.btn-edit').on('click',function(){
        // get data from button edit
        const id = $(this).data('id');
        const title = $(this).data('name');
        console.log("JOBID: " + id);
        console.log("JOBTITLE: " + title);
        // Set data to Form Edit
        $('.job_id').val(id);
        $('.job_title').val(title);
        // Call Modal Edit
        $('#editModal').modal('show');
    });

    $('.btn-delete').on('click',function(){
        // get data from button edit
        const id = $(this).data('id');
        // Set data to Form Edit
        $('.jobID').val(id);
        // Call Modal Edit
        $('#deleteModal').modal('show');
    });
}

【讨论】:

  • 我认为initComplete 可能是个问题,因为它只能访问当前绘制页面上的按钮 - 因此我对访问后续表格结果页面的评论。如果每次更改页面时 DataTable 都被销毁并重新初始化,那么您就可以了 - 但这通常不是必需的(而且我认为相对昂贵)。
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 2018-07-16
  • 2020-02-01
  • 2021-11-14
  • 2015-04-04
  • 1970-01-01
  • 2018-10-29
  • 2015-07-07
相关资源
最近更新 更多