Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

Object has been destroyed when open secondary/child window in electron js

Writer Matthew Harrington

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

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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