在我的游戏启动器电子项目我试图打开一个子窗口与按钮点击,并在那里,提供额外的功能。这些特征包括例如:打开exe文件。
为此,我需要Node.js,所以我尝试在preload脚本中创建方法,并通过contextBridge公开它们。
这些方法在主BrowserWindow中运行良好。但是,无法从子窗口访问它们(Uncaught ReferenceError:游戏未定义)。代码如下:
preload.js
const contextBridge = require('electron').contextBridge;
const ipcRenderer = require('electron').ipcRenderer;
const { BrowserWindow } = require('electron');
contextBridge.exposeInMainWorld(
'game', {
open: () => {
console.log('test');
},
openAddGamePage: () => {
console.log('test');
}
}
);
renderer.js(主窗口的脚本),公开的方法在这里工作得很好。
document.getElementById('openAddGameWindow').addEventListener('click', () => {
const childWindow = window.open('features/addGame/addGamePage.html', '_blank', 'nodeIntegration=yes')
game.open()
game.openAddGamePage()
})
addGame.js(来自addGamePage.html的脚本):这些方法在这里行不通
document.getElementById('addGameButton').addEventListener('click', () => {
game.open()
})
我还尝试在“addGame.js”中直接包含函数,并在创建子窗口时启用nodeIntegration,但这也不起作用(未定义require)。
1条答案
按热度按时间ht4b089n1#
这样做的原因是你正在从渲染过程中打开你的“子窗口”。IE:从您的
renderer.js
文件。这样做不会自动给予您访问以前的windows
preload.js
脚本的权限。事实上,恰恰相反。要从“子窗口”访问
preload.js
脚本,必须由Electron从主进程打开该窗口,就像主窗口一样。实现此目的的最佳方法是,在单击按钮时,从渲染进程主窗口(主进程)发送IPC消息。当主进程收到消息时,它将使用相同的
preload.js
脚本打开“子窗口”,从而使您可以访问与主窗口相同的功能。下面是一个最小可重复的示例。检查两个窗口的Developer Tools - Console选项卡中的
test
文本。main.js
(主工艺)preload.js
(主进程)launcher-window.html
(渲染过程)game-window.html
(渲染过程)