在主窗口中,单击按钮时,将通过ipc调用弹出第二个/子窗口。 这在第一次打开弹出窗口时有效。如果我关闭弹出窗口并再次重新打开它,我将收到此错误:
未捕获的异常:错误:对象在Error(本机)时被销毁 在EventEmitter。 (/home/xxxx/electron/fin/main.js:36:21)在emitOne上 (events.js:96:13)在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) 在eventsEmitter.emit的emitTwo(events.js:106:13)(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();
});
当我在'封闭'方法中添加hide()时:
popWindow.on('closed', function (event) {
popWindow.hide();
});
我明白了:
Uncaught Exception:
Error: Object has been destroyed
有什么问题?
答案 0 :(得分:3)
如果您关闭浏览器窗口,它将被销毁,因此您无法隐藏或显示它。由于您希望隐藏它并稍后再次显示,因此您应该为调用preventDefault()
的{{3}}添加一个侦听器并隐藏窗口而不是关闭它。
答案 1 :(得分:3)
当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;
});
}