You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
   }
  });
 });
});
<!-- 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">&times;</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>

问题定位与修复方案

核心问题点

  1. 模态框ID完全不匹配:
    按钮的data-target指向实际模态框ID#add_appo_modal,但JS代码却监听#add_appo_modal的点击事件,试图显示不存在的#appo_modal,逻辑完全错误。
  2. 重复触发逻辑冲突:
    按钮本身已使用Bootstrap原生的data-toggle="modal"和data-target="#add_appo_modal",可自动触发模态框,但JS中额外绑定的无效事件可能干扰原生逻辑。
  3. 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手动触发(适合自定义逻辑场景)

  1. 给「添加预约」按钮添加唯一ID:
<button type="button" class="btn btn-primary" id="open_add_appo_btn">Randevu Ekle</button>
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:27:05