Laravel后台预约模块添加按钮无法弹出Modal弹窗求助
问题:Laravel后台预约管理页面「添加预约」按钮无弹窗响应,无报错
在Laravel后台的预约管理页面中,点击「添加预约」按钮后没有任何弹窗弹出,且无报错信息,已尝试AI工具排查但未解决,请求帮忙定位问题。相关代码如下:
Appointment.blade.php
<!-- admin/appointment/index.blade.php --> @include('admin.static.header') <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-header"> <h3 class="card-title align-items-start flex-column"> <span class="card-label fw-bold text-dark">Randevular</span> </h3> <div class="card-toolbar"> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#add_appo_modal">Randevu Ekle</button> </div> </div> <div class="card-body p-5"> <table class="table table-row-dashed table-row-gray-200 align-middle gs-0 gy-4"> <thead> <tr class="text-start text-gray-700 fw-bolder fs-7 text-uppercase"> <th class="w-150px">Kullanıcı</th> <th class="w-150px">Randevu Tarihi</th> <th class="w-150px">Randevu Saati</th> <th class="w-150px">Doktor Adı</th> </tr> </thead> <tbody class="fw-bold text-gray-600 fs-7"> @foreach($appointments as $appointment) <tr> <td>{{ $appointment->user }}</td> <td>{{ $appointment->appo_date }}</td> <td>{{ $appointment->appo_time }}</td> <td>{{ $appointment->doctor_name }}</td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> @include('admin.static.footer') <script src="{{ asset('adminassets/page/appo.js') }}"></script>
Appo.js
$(document).ready(function () { // Randevu Ekle butonuna tıklanınca modal penceresini açar $('#add_appo_modal').on('click', function () { $('#appo_modal').modal('show'); }); // Randevu Kaydet butonuna tıklanınca, ajax isteği gönderir $('#add_appointment').on('click', function () { var user = $('#user').val(); var appo_date = $('#appo_date').val(); var appo_time = $('#appo_time').val(); var doctor_name = $('#doctor_name').val(); // Gerekli verileri bir obje olarak toplar var data = { 'user': user, 'appo_date': appo_date, 'appo_time': appo_time, 'doctor_name': doctor_name }; // Ajax isteği $.ajax({ url: '/admin/appointments', type: 'POST', data: data, dataType: 'json', success: function (data) { // Eğer işlem başarılıysa, sayfayı yeniler ve modalı kapatır location.reload(); $('#appo_modal').modal('hide'); }, error: function (data) { // Eğer bir hata oluşursa, hatayı gösterir console.log(data); } }); }); });
footer.blade.php(添加的模态框代码)
<!-- Modal --> <div class="modal fade" id="add_appo_modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Randevu Ekle</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <!-- Randevu ekleme formu --> <form> <div class="form-group"> <label for="user">Kullanıcı:</label> <input type="text" class="form-control" id="user" name="user"> </div> <div class="form-group"> <label for="appo_date">Randevu Tarihi:</label> <input type="date" class="form-control" id="appo_date" name="appo_date"> </div> <div class="form-group"> <label for="appo_time">Randevu Saati:</label> <input type="time" class="form-control" id="appo_time" name="appo_time"> </div> <div class="form-group"> <label for="doctor_name">Doktor Adı:</label> <input type="text" class="form-control" id="doctor_name" name="doctor_name"> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Kapat</button> <button type="button" class="btn btn-primary" id="add_appointment">Kaydet</button> </div> </div> </div> </div>
问题定位与修复方案
核心问题点
- 模态框ID完全不匹配:
按钮的data-target指向实际模态框ID#add_appo_modal,但JS代码却监听#add_appo_modal的点击事件,试图显示不存在的#appo_modal,逻辑完全错误。 - 重复触发逻辑冲突:
按钮本身已使用Bootstrap原生的data-toggle="modal"和data-target="#add_appo_modal",可自动触发模态框,但JS中额外绑定的无效事件可能干扰原生逻辑。 - AJAX请求缺少CSRF令牌:
Laravel的POST请求必须携带CSRF令牌,否则会返回419错误,这是后续保存功能的潜在问题。
修复步骤
方案1:保留Bootstrap原生触发逻辑(最简单)
删除Appo.js中多余的模态框触发代码,只保留保存按钮逻辑,并补充CSRF令牌:
$(document).ready(function () { // Randevu Kaydet butonuna tıklanınca, ajax isteği gönderir $('#add_appointment').on('click', function () { var user = $('#user').val(); var appo_date = $('#appo_date').val(); var appo_time = $('#appo_time').val(); var doctor_name = $('#doctor_name').val(); // Gerekli verileri bir obje olarak toplar(添加CSRF令牌) var data = { '_token': '{{ csrf_token() }}', 'user': user, 'appo_date': appo_date, 'appo_time': appo_time, 'doctor_name': doctor_name }; // Ajax isteği $.ajax({ url: '/admin/appointments', type: 'POST', data: data, dataType: 'json', success: function (data) { // 先关闭模态框再刷新,避免刷新后代码不执行 $('#add_appo_modal').modal('hide'); location.reload(); }, error: function (data) { console.log(data); } }); }); });
方案2:用JS手动触发(适合自定义逻辑场景)
- 给「添加预约」按钮添加唯一ID:
<button type="button" class="btn btn-primary" id="open_add_appo_btn">Randevu Ekle</button>
- 修改Appo.js中的触发逻辑,修正ID匹配问题,并补充CSRF令牌:
$(document).ready(function () { // Randevu Ekle butonuna tıklanınca modal penceresini açar $('#open_add_appo_btn').on('click', function () { $('#add_appo_modal').modal('show'); }); // Randevu Kaydet butonuna tıklanınca, ajax isteği gönderir $('#add_appointment').on('click', function () { var user = $('#user').val(); var appo_date = $('#appo_date').val(); var appo_time = $('#appo_time').val(); var doctor_name = $('#doctor_name').val(); var data = { '_token': '{{ csrf_token() }}', 'user': user, 'appo_date': appo_date, 'appo_time': appo_time, 'doctor_name': doctor_name }; $.ajax({ url: '/admin/appointments', type: 'POST', data: data, dataType: 'json', success: function (data) { $('#add_appo_modal').modal('hide'); location.reload(); }, error: function (data) { console.log(data); } }); }); });
额外检查项
确保header.blade.php中已正确引入jQuery和Bootstrap的JS文件,这是模态框正常工作的前提:
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js"></script>
内容的提问来源于stack exchange,提问作者mehmetozdemir
相关产品推荐
相关产品推荐

