本文介绍一种简洁、可复用的方式,使用单个参数化函数替代多个重复的模态框控制函数,实现对任意数量模态框的统一触发与关闭,显著提升代码可维护性与扩展性。
本文介绍一种简洁、可复用的方式,使用单个参数化函数替代多个重复的模态框控制函数,实现对任意数量模态框的统一触发与关闭,显著提升代码可维护性与扩展性。
在实际开发中,当页面存在多个功能相似但目标不同的模态框(如“选择客户”“选择供应商”“选择产品”等)时,若为每个模态框单独编写 setSelectedXxx() 函数,不仅造成大量冗余代码,还增加了后续维护成本。理想方案是抽象出通用逻辑,通过参数驱动行为,实现“一处定义、多处调用”。
核心思路是将模态框的唯一标识(如 ID 或 data 属性)作为参数传入函数,动态操作对应 DOM 元素。以下为基于 Bootstrap 5(或原生 JS + 简易 CSS)的轻量级实现:
<!-- 触发按钮 —— 统一 class,通过 data-target 指定目标模态框 --><button type="button" class="btn btn-primary modal-trigger" data-target="modal-pelanggan"> 选择客户</button><button type="button" class="btn btn-primary modal-trigger" data-target="modal-vendor"> 选择供应商</button><!-- 模态框容器(Bootstrap 5 结构) --><div class="modal fade" id="modal-pelanggan" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">选择客户</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <div class="form-check"> <input class="form-check-input" type="radio" name="pelanggan-option" id="opt1" value="1"> <label class="form-check-label" for="opt1">张三贸易有限公司</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="pelanggan-option" id="opt2" value="2"> <label class="form-check-label" for="opt2">李四科技发展公司</label> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button> <button type="button" class="btn btn-primary confirm-btn" data-field="selectedPelanggan">确定</button> </div> </div> </div></div><div class="modal fade" id="modal-vendor" tabindex="-1"> <!-- 类似结构,data-field="selectedVendor" --></div>
// ✅ 统一处理:打开指定模态框function openModal(targetId) { const modalEl = document.getElementById(targetId); if (modalEl) { const bsModal = new bootstrap.Modal(modalEl); bsModal.show(); }}// ✅ 统一处理:提交并回填到指定字段document.querySelectorAll('.confirm-btn').forEach(btn => { btn.addEventListener('click', function() { const fieldId = this.dataset.field; // 如 'selectedPelanggan' const selectedRadio = document.querySelector(`#${this.closest('.modal').id} input[name$="-option"]:checked`); if (selectedRadio) { const label = document.querySelector(`label[for="${selectedRadio.id}"]`); document.getElementById(fieldId).value = label?.textContent?.trim() || ''; } // 自动关闭当前模态框 bootstrap.Modal.getInstance(this.closest('.modal')).hide(); });});// ✅ 统一绑定触发按钮document.querySelectorAll('.modal-trigger').forEach(btn => { btn.addEventListener('click', function() { openModal(this.dataset.target); });});
? 关键优势说明:
- 所有按钮共享 .modal-trigger 类,仅需 data-target 区分目标;
- 所有确认按钮共享 .confirm-btn 类,通过 data-field 动态指定回填目标输入框;
- 无需为每个模态框写独立函数,新增模态框只需复制 HTML 结构 + 更新 data-target 和 data-field 即可;
- 完全兼容 Bootstrap 5 的 Modal API,支持 backdrop、keyboard 等原生特性。
通过这种参数化设计,你将告别复制粘贴式编码,让模态框逻辑真正变得可配置、易扩展、易测试——这也是现代前端工程化思维的重要体现。