Bootstrap菜单无法展开求助:引入JQuery后仍无效
Bootstrap 菜单无法展开的问题排查与修复
问题根源分析
你的代码里存在几个关键问题,直接导致菜单无法正常展开:
- 重复引入jQuery且版本混乱:同时加载了jQuery 2.1.3、jQuery 3.2.1 slim版,slim版移除了Bootstrap依赖的
$.fn.modal、$.fn.dropdown等核心方法,即便控制台没提示jQuery缺失,功能也会异常。 - Bootstrap版本冲突:同时加载了Bootstrap 3.3.5和Bootstrap 4.0.0的JS文件,两个版本的组件逻辑冲突,导致菜单初始化失败。
- 脚本加载顺序错误:Popper.js是Bootstrap 4必需的依赖,但你把它放在了Bootstrap 3 JS之后、Bootstrap 4 JS之前,顺序完全不对;且自定义的
application.js用了defer,可能导致DOM加载完成后脚本初始化时机异常。
修复后的代码示例
application.html.erb
<!DOCTYPE html> <html> <head> <title>Peachux</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> <link href="https://assets.calendly.com/assets/external/widget.css" rel="stylesheet"> <script src="https://kit.fontawesome.com/b43f353bd3.js" crossorigin="anonymous"></script> </head> <body> <%= render "shared/navbar" %> <%= render "shared/flashes" %> <%= yield %> <%= render "shared/footer" %> <!-- 脚本移到body末尾,避免阻塞渲染,保证加载顺序正确 --> <%= javascript_include_tag "application", "data-turbo-track": "reload" %> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> <script src="https://assets.calendly.com/assets/external/widget.js" type="text/javascript" async></script> </body> </html>
额外说明
- 移除了所有重复的jQuery和Bootstrap 3 JS,只保留与你scss中Bootstrap版本匹配的Bootstrap 4 JS。
- 把所有脚本移到
</body>标签前,保证DOM完全加载后再执行脚本,避免菜单元素未渲染就初始化的问题。 - 保留了Calendly和Font Awesome的资源,调整位置以优化加载顺序。
- 如果你的
application.js里有自定义Bootstrap初始化代码,确保不要重复调用组件初始化方法,Bootstrap 4会自动初始化带有data-toggle等属性的元素。
内容的提问来源于stack exchange,提问作者PeachSandwich
相关产品推荐
相关产品推荐

