bootstrap 5 js插件必须用bootstrap.modal.getorcreateinstance()等显式实例化,禁用jquery语法;事件须绑定到dom元素本身,属性名强制data-bs-*前缀,且初始化代码须确保在bootstrap.bundle.min.js加载后执行。

Bootstrap 5 的 JS 插件根本不能用 $ 调用,所有 $.modal()、$('.dropdown').dropdown('toggle') 这类写法会直接报 TypeError: $ is not a function 或 ReferenceError: $ is not defined —— 不是配置问题,是代码被彻底移除。
bootstrap.Modal 等构造器必须显式 new 实例
每个组件现在都是一个独立的 ES6 类,挂载在全局 bootstrap 对象下。不能靠选择器批量触发,必须先获取 DOM 元素,再传入构造器。
-
document.getElementById('myModal')或document.querySelector('#myModal')必须存在,否则new bootstrap.Modal(null)会抛错 - 推荐用
bootstrap.Modal.getOrCreateInstance()替代new,它自动防重复初始化(比如模态框多次点击) - 若需批量控制多个 Modal,得用
querySelectorAll+ 循环:document.querySelectorAll('[data-bs-toggle="modal"]')找出触发源,再各自绑定逻辑 - 示例:安全初始化并打开
const myModalEl = document.getElementById('myModal')
if (myModalEl) {
const modal = bootstrap.Modal.getOrCreateInstance(myModalEl)
modal.show()
}
data-bs-* 属性只管“自动初始化”,不响应手动调用
写了 data-bs-toggle="modal",点击按钮能弹窗,是因为 Bootstrap 在 DOM 就绪时扫描并自动调用了 bootstrap.Modal;但你想在 JS 里执行 modal.hide(),就得自己持有实例引用。
- 动态插入的 HTML(如
innerHTML += '...')不会被自动扫描,data-bs-toggle在里面完全无效 - 如果同时写了
data-bs-toggle又手动new bootstrap.Modal(),可能触发两次事件(比如show.bs.modal触发两遍) - 属性名必须带
bs-前缀:data-bs-target="#myModal",漏掉bs-就静默失效,控制台无提示
事件监听必须绑定到 DOM 元素本身
v4 习惯写 $(document).on('shown.bs.modal', '#myModal', handler),v5 不再支持事件委托式监听,必须直接绑在目标元素上。
- 正确方式:
document.getElementById('myModal').addEventListener('shown.bs.modal', handler) - 注意:事件名不变(仍是
shown.bs.modal),但触发对象是 Modal 的根 DOM 元素,不是document - 如果 Modal 是动态创建的,事件监听代码必须在
new或getOrCreateInstance()之后执行,否则监听无效 - 移除监听要用
removeEventListener,不能依赖 jQuery 的off()—— 它不存在
常见错误:bootstrap is not defined 怎么办
这个错误和引入文件无关,90% 是执行时机错了 —— 你的 JS 代码跑在 bootstrap.bundle.min.js 加载完成前。
-
bootstrap.bundle.min.js必须放在你自定义脚本之前,且不能只靠defer保序(CDN 场景下尤其危险) - 最稳写法:把初始化代码包进
DOMContentLoaded,或直接放在











