在 electron js 中打开 secondary/child window 时对象已被销毁
Object has been destroyed when open secondary/child window in electron js
在主 window 中,单击按钮时,将通过 ipc 调用弹出 second/child window。
这在第一次打开 pop window 时起作用。如果我关闭 pop window 并再次打开它,我会得到这个错误:
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/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();
});
当我在 'closed' 方法中添加 hide() 时:
popWindow.on('closed', function (event) {
popWindow.hide();
});
我明白了:
Uncaught Exception:
Error: Object has been destroyed
问题是什么?
如果您关闭浏览器 window 它将被销毁,因此之后您将无法再次隐藏或显示它。由于您想隐藏它并稍后再次显示它,您应该为调用 preventDefault()
的 close
event 添加一个侦听器并隐藏 window 而不是关闭它。
当弹出窗口关闭时,您应该将弹出窗口设置为空。当下一次来自 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;
});
}
在主 window 中,单击按钮时,将通过 ipc 调用弹出 second/child window。 这在第一次打开 pop window 时起作用。如果我关闭 pop window 并再次打开它,我会得到这个错误:
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/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();
});
当我在 'closed' 方法中添加 hide() 时:
popWindow.on('closed', function (event) {
popWindow.hide();
});
我明白了:
Uncaught Exception:
Error: Object has been destroyed
问题是什么?
如果您关闭浏览器 window 它将被销毁,因此之后您将无法再次隐藏或显示它。由于您想隐藏它并稍后再次显示它,您应该为调用 preventDefault()
的 close
event 添加一个侦听器并隐藏 window 而不是关闭它。
当弹出窗口关闭时,您应该将弹出窗口设置为空。当下一次来自 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;
});
}