在电子中关闭BrowserWindow时,事件侦听器继续引用BrowserWindow

zms200

我的标题可能无法正确捕捉我的问题,但是我找不到捕捉问题的简洁方法。

问题是这样的:

我有一个由IPC事件触发的BrowserWindow。当BroswerWindow打开时,它会向主进程发送一条消息,以表明已完成加载,然后主进程向其发送一些数据以执行特定任务。完成任务后,用户关闭窗口,并开始执行其他过程。

一切正常,除了应用程序接收到该事件以再次打开BrowserWindow之外,将数据发送到新窗口的事件处理程序抛出错误,表明由于进程已被破坏或重新打开而无法将数据发送到窗口窗口,但包含第一次打开窗口时的所有旧数据,当时我需要的是窗口的新实例。我知道我可以简单地使用javascript拆卸并重新生成原始HTML,但是我觉得必须有更好的方法。这是下面的代码:

main.js

const electron = require ("electron");
const ipcMain = require('electron').ipcMain;
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
function openNewWindow() {
    let win = new BrowserWindow({ autoHideMenuBar: true });
    win.loadURL(__dirname + '\\new_window.html');
    win.webContents.openDevTools()
    win.on('closed', function () {
       win = null;
    })
    return win
};

let mainWindow;

app.on('window-all-closed', function () {
   if (process.platform != 'darwin') {
     app.quit ();
   }
});

app.on('ready', function () {
   mainWindow = new BrowserWindow ({
                    title: app.getName() + " - v" + app.getVersion(),
                    autoHideMenuBar: true
   });

   mainWindow.loadURL ('file://' + __dirname + '/index.html');

    //This event handler opens the new window when it receives the open-new-window event
    ipcMain.on('open-new-window', (event,arg) => {
        console.log('Arg = ' + arg);
        let newWindow = openNewWindow();
        //This event handler sends data to the new window when the new window indicates that it is done loading
        ipcMain.on('done-loading',(event2,arg2) => {
            console.log(arg2);
            newWindow.webContents.send('test',arg);
        });
    });

   // Close the application when the window is closed
   mainWindow.on ('closed', function() {
     mainWindow = null;
   });
});

这是我在关闭新窗口后触发open-new-window事件时遇到的错误:

错误消息中对第52行的引用是此行:

newWindow.webContents.send('test',arg);

新窗口打开,但是没有数据发送给它。

普希金

问题类似于问题。

每个open-new-window事件都会导致您重新订阅新窗口ipcMaindone-loading事件,但仍会保留对旧窗口的订阅/关闭。

您不想ipcMain.on("done-loading", ...)在新窗口处理程序内部执行操作

您想在窗口处理程序之外执行此操作,而是使用event参数将响应发送回相同的webcontents:

ipcMain.on('open-new-window', (event, arg) => {
    openNewWindow();
});

ipcMain.on('done-loading', (event, arg) => {
    event.sender.send('test', arg);
});

但是,有一个did-finish-load事件可以完成您似乎想做的事情:

function openNewWindow() {
    let win = new BrowserWindow({ autoHideMenuBar: true });
    win.loadURL(__dirname + '\\new_window.html');
    win.webContents.once("did-finish-load", () => {
        win.webContents.send("test", ...);
    });
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

子事件侦听器继续在recyclerView中添加自己

电子:删除beforeunload事件侦听器

AWT窗口关闭侦听器/事件

从BrowserWindow电子类扩展时出错

如何从电子中的WebContents获取BrowserWindow?

Java 中的事件(侦听器)

类中的 Javascript 事件侦听器

jQuery中的单击事件侦听器

在同一引用上有多个侦听器时从 Firebase 中删除侦听器

电子:如何在另一个文件中引用全局BrowserWindow对象?

将点击事件侦听器添加到电子应用程序中的元素

我需要在关闭窗口之前从窗口对象中删除事件侦听器吗?

jQuery + 整页 + 移动菜单关闭 = 无法阻止被动事件侦听器中的默认值

电子:BrowserWindow.on 关闭提示不起作用

Dojo:在事件侦听器回调中维护对窗口小部件的引用

单击特定的div时仅执行一次事件侦听器,但继续在其他div上执行

通过引用Laravel事件侦听器传递数组

事件侦听器中的匿名函数与事件侦听器中的匿名函数

使用短符号时,如何在匿名侦听器中引用“ this”?

当游戏在战舰上结束时,如何从所有<tds>中删除事件侦听器?

当元素从 DOM 中删除时,Angularjs 会删除事件侦听器

在Picasso库中,现在如何在我的图像加载时触发哪个事件侦听器?

当在Javascript中单击子元素时,如何覆盖父事件侦听器?

在JS中创建元素时内联添加事件侦听器是不好的做法吗?

尝试在ScalaFx中绑定鼠标事件侦听器时发生编译错误

如果用户关闭浏览器,Firestore是否会继续阅读onSnapshot侦听器的文档?

表事件侦听器

事件侦听器的范围

Javascript事件侦听器