在电子js中打开辅助/子窗口时对象已被破坏

dev*_*jim 3 javascript node.js electron

在主窗口中,单击按钮时,将通过 ipc 调用弹出第二个/子窗口。这在第一次打开弹出窗口时有效。如果我关闭弹出窗口并重新打开它,我将收到此错误:

未捕获的异常:错误:对象已在 EventEmitter 的错误(本机)处被销毁。(/home/xxxx/electron/fin/main.js:36:21) 在 EventEmitter.emit (events.js:188:7) 在 EmitOne (events.js:96:13) 在 EventEmitter。(/home/xxxx/electron/fin/node_modules/electron-prebuilt/dist/resources/electron.asar/browser/api/web-contents.js:156:13) at emitTwo (events.js:106:13) at EventEmitter.emit (events.js:191:7)

#main.js on app ready:
mainWindow = new BrowserWindow({width: 800, height: 600})


  mainWindow.loadURL(`file://${__dirname}/index.html`)


  mainWindow.webContents.openDevTools()


  mainWindow.on('closed', function () {

    mainWindow = null
  })

  let popWindow = new BrowserWindow({parent: mainWindow, width: 450, height: 450, show: false});
  popWindow.loadURL(`file://${__dirname}/app/pop.html`);
  popWindow.webContents.openDevTools();

  ipc.on('toggle-popwindow', function(){
         popWindow.show();    
  });
Run Code Online (Sandbox Code Playgroud)

当我在“关闭”方法中添加 hide() 时:

popWindow.on('closed', function (event) {
popWindow.hide();
});
Run Code Online (Sandbox Code Playgroud)

我明白了:

Uncaught Exception:
Error: Object has been destroyed
Run Code Online (Sandbox Code Playgroud)

问题是什么?

Vad*_*gon 7

如果您关闭浏览器窗口,它将被销毁,因此您无法在此之后隐藏或再次显示它。由于您想隐藏它并稍后再次显示它,您应该为调用和隐藏窗口而不是关闭窗口的close事件添加一个侦听器preventDefault()


小智 6

当 popWindow 关闭时,您应该将 popWindow 设置为 null。当来自 ipc 的下一个打开请求时,再次实例 popWindow。

mainWindow = new BrowserWindow({width: 800, height: 600})


mainWindow.loadURL(`file://${__dirname}/index.html`)


mainWindow.webContents.openDevTools()


mainWindow.on('closed', function () {

  mainWindow = null
  popWindow=null;
})

ipc.on('toggle-popwindow', function(){
    if(!popWindow){
      openPopWindow(function(){
            popWindow.show();    
      });
    } else{
        popWindow.show();    
    }
});

function openPopWindow(callback){
  let popWindow = new BrowserWindow({parent: mainWindow, width: 450, height: 450, show: false});
    popWindow.loadURL(`file://${__dirname}/app/pop.html`);
    popWindow.webContents.openDevTools();

  popWindow.webContents.on('did-finish-load', function () {
    if (typeof callback == 'function') {
      callback();
    }
  });

    // set to null
  popWindow.on('close', () => {
    popWindow = null;
  });

    // set to null
  popWindow.on('closed', () => {
    popWindow = null;
  });
}
Run Code Online (Sandbox Code Playgroud)