点击按钮时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">×</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>
解决要点
DOM加载时机问题:由于JS文件是
type="module",模块脚本默认延迟执行,但jQuery事件绑定需要确保DOM完全加载。将按钮点击、表单提交逻辑包裹在$(function(){ ... })中($(document).ready()的简写),确保DOM加载完成后再绑定事件。tbody元素取值错误:原代码中
bodyProductos = $('#bodyProductos').val();错误,<tbody>不是表单元素,没有val()方法,直接用$('#bodyProductos')获取DOM元素即可。模态框调用逻辑:修正后,点击
#btnNuevo按钮时会正确触发$('#modalAltaEdicion').modal('show')显示模态框。
内容的提问来源于stack exchange,提问作者shemjay
相关产品推荐
相关产品推荐

