【解决】Electron 引用JQuery 报错 Uncaught ReferenceError: $ is not defined

本文探讨了在Electron环境下使用jQuery、RequireJS、AngularJS等库时遇到的问题及解决方案,包括修改引用方式、代码调整及官方推荐的nodeIntegration设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Electron 的官方文档已经告诉我们:

因为 Electron 在运行环境中引入了 Node.js,所以在 DOM 中有一些额外的变量,比如 module、exports和require。 这导致 了许多库不能正常运行,因为它们也需要将同名的变量加入运行环境中。并给出了一些解决方案。

我在 Electron 中无法使用 jQuery、RequireJS、Meteor、AngularJS.

除了官方给出的解决方案,也收罗了其他的如下方法:
  • 方案一: 更改jq的引用写法:<script>window.$ = window.jQuery = require("./js/jquery.min.js")</script>
  • 方案二: 去掉jQuery中的第一行代码中的模块引入判断代码
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}

改写为

!function(a,b){b(a)}

附上官方的解决方案
  • 将nodeIntegration设为false,不过这样的做法页面就不能使用nodejs和Electron APIs
// 在主进程中
const { BrowserWindow } = require('electron')
let win = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
})
win.show()
  • 假如你依然需要使用 Node.js 和 Electron 提供的 API,你需要在引入那些库之前将这些变量重命名。缺点是每个需要引用的页面都需要这样去改
<head>
	<script>
		window.nodeRequire = require;
		delete window.require;
		delete window.exports;
		delete window.module;
	</script>
	<script type="text/javascript" src="jquery.js"></script>
</head>
### Vue 中使用 limarquee.js 出现 Uncaught ReferenceError: strMoveTop is not defined解决方案 在 Vue 项目中使用第三方库时,如果出现 `Uncaught ReferenceError: strMoveTop is not defined` 错误,通常是因为以下原因之一导致的:limarquee.js 文件未正确引入、相关变量或函数未被正确声明或初始化。以下是解决该问题的详细方法。 #### 1. 确保正确引入 limarquee.js 文件 需要确保 limarquee.js 文件已被正确加载到项目中。可以通过以下两种方式之一实现文件引入: - **通过 `<script>` 标签引入** 如果是基于纯 HTML 的 Vue 项目,可以在 HTML 文件的 `<head>` 或 `<body>` 部分添加如下代码: ```html <script type="text/javascript" src="path/to/limarquee.js"></script> ``` 确保路径正确,并且文件已成功加载[^1]。 - **通过 npm 安装并导入** 如果使用的是 Vue CLI 或其他构建工具,可以先通过 npm 安装 limarquee.js: ```bash npm install limarquee --save ``` 然后在 Vue 组件中导入: ```javascript import 'limarquee'; ``` #### 2. 检查全局变量声明 错误提示 `strMoveTop is not defined` 表明在使用 `strMoveTop` 时,该变量尚未定义或不可用。可能的原因包括: - limarquee.js 中的变量未正确挂载到全局作用域。 - 变量名拼写错误或与文档中的说明不一致。 可以通过以下方式解决: - **检查 limarquee.js 的文档或源码** 查看 `strMoveTop` 是否为 limarquee.js 提供的全局变量。如果是,请确保其已被正确初始化。例如: ```javascript window.strMoveTop = 'someValue'; // 确保变量已声明 ``` - **手动声明变量** 如果 `strMoveTop` 是由 limarquee.js 动态生成的全局变量,但未正确挂载到 `window` 对象上,可以手动声明它: ```javascript if (typeof strMoveTop === 'undefined') { window.strMoveTop = 'defaultStringValue'; // 设置默认值 } ``` #### 3. 确保脚本执行顺序 如果 limarquee.js 文件依赖于其他脚本(如 jQuery),则需要确保这些依赖项在 limarquee.js 加载之前已被正确加载。例如: ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="path/to/limarquee.js"></script> ``` #### 4. 使用模块化方式避免全局污染 为了避免全局变量污染,建议将 limarquee.js 封装为一个模块,并通过 Vue 的生命周期钩子进行初始化。例如: ```javascript <template> <div id="marquee-container"></div> </template> <script> import 'limarquee'; export default { mounted() { if (typeof strMoveTop !== 'undefined') { // 初始化 marquee 功能 this.initMarquee(); } else { console.error('strMoveTop is not defined'); } }, methods: { initMarquee() { // 调用 limarquee.js 提供的功能 const marqueeElement = document.getElementById('marquee-container'); marqueeElement.innerHTML = '滚动文字内容'; strMoveTop(marqueeElement); // 假设 strMoveTop 是一个函数 } } }; </script> ``` #### 5. 检查上下文隔离问题 如果项目运行在 Electron 环境下,可能会因为上下文隔离(contextIsolation)导致全局变量无法正常访问。可以通过设置 `contextIsolation: false` 来解决此问题[^2]。例如: ```javascript const mainWindow = new BrowserWindow({ webPreferences: { nodeIntegration: true, contextIsolation: false } }); ``` --- ### 示例代码 以下是一个完整的示例,展示如何在 Vue 中正确使用 limarquee.js: ```html <template> <div id="marquee-container"></div> </template> <script> import 'limarquee'; export default { mounted() { if (typeof strMoveTop !== 'undefined') { this.initMarquee(); } else { console.error('strMoveTop is not defined'); } }, methods: { initMarquee() { const marqueeElement = document.getElementById('marquee-container'); marqueeElement.innerHTML = '这是一个滚动文字示例'; strMoveTop(marqueeElement); } } }; </script> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值