【问题标题】:ipcRenderer not receiving the message from webContents.send (Electron)ipcRenderer 没有收到来自 webContents.send 的消息(电子)
【发布时间】:2022-01-25 17:46:07
【问题描述】:

在我的程序的主窗口中,我有一个按钮,如果单击该按钮,则会创建一个新的附加窗口。当这个新窗口完成加载后,我想向ipcRenderer 发送消息;但是,到目前为止,即使窗口创建成功,我也无法让ipcRenderer 能够接收到消息。

这是main.js中代码的sn-p:

const { ipcMain } = require('electron');

ipcMain.handle('open-window', () => {
    const newWindow = createWindow();
    newWindow.on('did-finish-load', () => {
        newWindow.webContents.send('opened-window');
    });
});

请注意,createWindow 是一个创建并返回浏览器窗口的函数。

这是preload.js中代码的sn-p:

const { ipcRenderer } = require('electron');

window.addEventListener('DOMContentLoaded', () => {
  document.getElementById('openWindow').addEventListener('click', () => {
        ipcRenderer.invoke('open-window');
    });
});

ipcRenderer.on('opened-window', () => {
    console.log('received message!')
})

如您所见,我希望在新窗口完成加载后在控制台中收到字符串received message!;但是,这并没有发生。我做错了什么?

【问题讨论】:

    标签: javascript node.js electron ipcrenderer ipcmain


    【解决方案1】:

    您将"opened-window" 发送到您创建的新窗口,而不是按下按钮的原始窗口。

    newWindow.webContents.send('opened-window')
    

    您需要引用带有按钮和opened-window 处理程序的窗口,而不是newWindow

    【讨论】:

    • 嗯...我明白你在说什么,但它仍然无法正常工作。我尝试像这样在终端上打印一些东西:newWindow.on('did-finish-load', () => { console.log('print here') });,但没有任何东西打印到终端上。有趣的是,如果我使用ready-to-show 而不是did-finish-load,我会在终端中看到print here,但即使按照您的建议,我也无法让ipcRenderer 收到消息。
    • @6cloud9 你能在你加载窗口的createWindow 中显示代码吗?
    • 当然可以,但实际上这是一个非常简单的函数。我只是创建了一个BrowserWindow 的新实例,其中nodeIntegration 设置为falsecontextIsolation 设置为true,差不多就是这样(除了设置窗口的宽度、高度,等)。
    • 我意识到我的错误。我没有使用on 事件,而是直接调用windowWithTheButton.webContents.send('opened-window');
    猜你喜欢
    • 2021-01-29
    • 2020-05-30
    • 1970-01-01
    • 2021-06-26
    • 2019-07-30
    • 1970-01-01
    • 2013-08-13
    • 2021-12-10
    • 2015-05-20
    相关资源
    最近更新 更多