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...
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.