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

点击按钮时Bootstrap模态表单无法显示的技术求助

问题:Bootstrap模态框点击按钮无反应

我使用Bootstrap、Firebase和jQuery开发网站,设置了一个按钮,点击后本应弹出模态表单供用户输入数据,数据存入Firebase数据库后展示在网站表格中。但点击按钮完全无反应,模态框无法显示。

预期显示的模态框样式如下:
预期弹出的模态框

相关代码

JS代码(firestore.js)

import { getDatabase } from "https://www.gstatic.com/firebasejs/7.15.0/firebase-database.js";
import { initializeApp } from "https://www.gstatic.com/firebasejs/7.15.0/firebase-app.js";

// Your web app's Firebase configuration
const firebaseConfig = {
  apiKey: "xxxxxxxxxx",
  authDomain: "xxxxxx",
  databaseURL: "xxxxxxx",
  projectId: "xxxxx",
  storageBucket: "xxxxxxxxxxx",
  messagingSenderId: "xxxxxx",
  appId: "xxxxxxxxx"
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = firebase.database(app);
coleccionProductos = db.ref().child('productos');
bodyProductos = $('#bodyProductos'); // 修正:tbody无val()方法,直接获取元素即可
console.log(bodyProductos);  

const iconoEditar = '';
const iconoBorrar = '';
function mostrarProductos({codigo, descripcion, cantidad}){
  return `
  <td>${codigo}</td>
  <td>${descripcion}</td>
  <td>${cantidad}</td>
  <td><button class="btnEditar btn btn-secondary" data-toggle="tooltip" title="Editar">${iconoEditar}</button><button class="btnBorrar btn btn-danger" data-toggle="tooltip" title="Borrar">${iconoBorrar}</button></td>
  `
}

// 确保DOM加载完成后再绑定事件
$(function(){
  // 表单提交逻辑
  $('form').submit(function(e){
    e.preventDefault();
    let id = $('#id').val();
    let codigo = $('#codigo').val();
    let descripcion = $('#descripcion').val();
    let cantidad = $('#cantidad').val();
    let idFirebase = id;
    if(idFirebase == ''){
     idFirebase = coleccionProductos.push().key;
    }
    data = {codigo:codigo, descripcion: descripcion, cantidad: cantidad};
    actualizacionData = {};
    actualizacionData[`/${idFirebase}`] = data;
    coleccionProductos.update(actualizacionData);
    id = '';
    $('form').trigger('reset');
    $('#modalAltaEdicion').modal('hide');
  });

  // 新增按钮点击逻辑
  $('#btnNuevo').click(function(){
    $('#id').val('');
    $('#codigo').val('');
    $('#descripcion').val('');
    $('#cantidad').val('');
    $('form').trigger('reset');
    $('#modalAltaEdicion').modal('show');
  });
});

HTML代码

<!doctype html>
<html lang="es">
  <head>
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

    <title>Firebase CRUD</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <div class="col-lg-12">
            <button id="btnNuevo" class="btn btn-primary" data-toggle="tooltip" title="Nuevo Producto"><svg class="bi bi-plus-circle-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4a.5.5 0 0 0-1 0v3.5H4a.5.5 0 0 0 0 1h3.5V12a.5.5 0 0 0 1 0V8.5H12a.5.5 0 0 0 0-1H8.5V4z"/></svg></button>
              <!--Modal-->
                <div id="modalAltaEdicion" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
                    <div class="modal-dialog" role="document">
                        <div class="modal-content">
                            <div class="modal-header bg-primary text-light">
                                <h5 class="modal-title" id="exampleModalLabel">新增/编辑</h5>
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                                </button>
                            </div>
                                <form>
                                <div class="modal-body">
                                    <input id="id" type="hidden"> <!-- 从Firebase获取的ID -->
                                    <div class="form-group">                                     
                                      <label>编码</label>
                                      <input id="codigo" type="text" class="form-control" required>
                                    </div>    
                                    <div class="form-group">
                                      <label>描述</label>
                                      <input id="descripcion" type="text" class="form-control" required>
                                    </div>
                                    <div class="form-group">
                                      <label>数量</label>
                                      <input id="cantidad" type="number" class="form-control" required>
                                    </div>                                     
                                </div>
                                <div class="modal-footer">
                                    <button type="button" class="btn btn-secondary" data-dismiss="modal" tabindex="2">取消</button>
                                    <button type="submit" id="btnGuardar" class="btn btn-primary" translate="1">保存</button>
                                </div>
                               </form>
                    </div>
                </div>
                </div>
              <table id="tablaProductos" class="table table-bordered">
                <thead>
                  <tr class="bg-dark text-light">
                    <th scope="col">编码</th>
                    <th scope="col">描述</th>
                    <th scope="col">数量</th>
                    <th scope="col">操作</th>
                  </tr>
                </thead>
              <tbody id="bodyProductos">
              </tbody>
              </table>
        </div>
      </div>
    </div>
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@9.14.4/dist/sweetalert2.all.min.js"></script> 
    <!-- The core Firebase JS SDK is always required and must be listed first -->
    <script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-app.js"></script>
    <script type = "module" src = "firestore.js"></script>
  </body>
</html>

解决要点

  1. DOM加载时机问题:由于JS文件是type="module",模块脚本默认延迟执行,但jQuery事件绑定需要确保DOM完全加载。将按钮点击、表单提交逻辑包裹在$(function(){ ... })中($(document).ready()的简写),确保DOM加载完成后再绑定事件。

  2. tbody元素取值错误:原代码中bodyProductos = $('#bodyProductos').val();错误,<tbody>不是表单元素,没有val()方法,直接用$('#bodyProductos')获取DOM元素即可。

  3. 模态框调用逻辑:修正后,点击#btnNuevo按钮时会正确触发$('#modalAltaEdicion').modal('show')显示模态框。

内容的提问来源于stack exchange,提问作者shemjay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:15:42