Object Has Been Destroyed When Open Secondary/Child Window in Electron Js

In a main window, when a button is clicked, the second/child window will popped up via an ipc call. This works when open the pop window on the first time. If I closed the pop window and reopen it again, I will get this error:

Uncaught Exception: Error: Object has been destroyed at Error (native) at EventEmitter. (/home/xxxx/electron/fin/main.js:36:21) at emitOne (events.js:96:13) at EventEmitter.emit (events.js:188:7) at EventEmitter. (/home/xxxx/electron/fin/node_modules/electron-prebuilt/dist/resources/) 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();    
  });

And when I add hide() in the 'closed' method:

popWindow.on('closed', function (event) {
popWindow.hide();
});

I get this:

Uncaught Exception:
Error: Object has been destroyed

What is the problem?

2 Answers

when popWindow is closed,you should set popWindow to null. when the next open request from the ipc, instance popWindow again.

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;
  });
}

If you close a browser window it will be destroyed, so you can't hide or show it again after that. Since you want to hide it and show it again later your should add a listener for the close event that calls preventDefault() and hides the window instead of closing it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Marcus Vance

Marcus Vance

Cybersecurity & Digital Privacy Researcher

Marcus Vance is a cybersecurity auditor and technology writer dedicated to educating the public about online safety, data privacy regulations, enterprise security, and emerging cyber threats.

Share this article
Twitter Facebook Pinterest