Ruby on Rails应用中jQuery无法正常工作的问题求助
解决Rails新项目中jQuery无法正常工作的问题
核心问题分析
你当前代码同时混用了ES模块的import语法和Sprockets的//= require语法,导致模块系统冲突,出现Uncaught SyntaxError: Cannot use import statement outside a module错误;加上Turbo的页面加载机制影响事件绑定时机、jQuery未全局挂载,最终导致功能失效。
修复步骤
1. 重构application.js,统一使用ES模块语法
删除所有//= require语句,改用ES模块导入,并将jQuery挂载到全局:
import "@hotwired/turbo-rails" import "controllers" import $ from 'jquery' import 'jquery_ujs' import './menu.js' // 将jQuery挂载到全局window对象,确保其他文件能直接使用$和jQuery window.$ = $ window.jQuery = $
2. 调整menu.js的事件绑定逻辑,适配Turbo加载机制
由于Turbo会动态加载页面内容,直接绑定事件可能在DOM未渲染完成时执行,需监听Turbo的加载事件:
document.addEventListener('turbo:load', () => { $(".star").on('click', function () { $(".star").hide(); }); });
或者使用jQuery的ready方法兼容传统加载:
$(document).ready(() => { $(".star").on('click', function () { $(".star").hide(); }); });
3. 修正layout中的JavaScript引入标签
根据你的Rails配置选择正确的引入方式:
- 若使用Importmap(Rails 7默认):
<%= javascript_importmap_tags %> - 若使用jsbundling(如esbuild/webpack):
<%= javascript_include_tag "application", "data-turbo-track": "reload" %>
注意不要同时混用两种引入方式。
4. 重启Rails服务器
所有配置修改完成后,必须重启服务器才能让变更生效。
其他错误说明
- 预加载相关错误:属于浏览器资源加载的警告,核心功能修复后可忽略,若要解决可检查importmap的crossorigin配置。
- 扩展程序的source map错误:是浏览器扩展的问题,与你的项目无关,无需处理。
内容的提问来源于stack exchange,提问作者Liam Thompson
相关产品推荐
相关产品推荐

