我知道有数百个问题如下:"我如何防止电子中的近距离事件?或类似的东西。
在beforeunload
事件中实现确认框(电子消息框)后,我能够关闭我的应用并取消关闭事件。由于开发工具始终是开放的,我没有认识到开发工具关闭时它不起作用......
window.onbeforeunload = e =>
{
// show a message box with "save", "don't save", and "cancel" button
let warning = remote.dialog.showMessageBox(...)
switch(warning)
{
case 0:
console.log("save");
return;
case 1:
console.log("don't save");
return;
case 2:
console.log("cancel");
return false;
// e.returnValue = "false";
// e.returnValue = false;
}
};
因此,当打开开发工具时,我可以通过保存关闭应用程序,而不保存并取消事件 当开关工具关闭时,取消按钮不再起作用。
顺便说一句:
window.onbeforeunload = e =>
{
return false;
alert("foo");
};
将取消关闭事件,显然不会显示该消息(如果dev工具打开或关闭,则无关紧要)
window.onbeforeunload = e =>
{
alert("foo");
return false;
};
如果dev工具打开,将在按下确定后取消关闭事件,如果关闭开发工具,则在按下确定后关闭应用程序
我故意使用消息框的同步api,当我写这个问题时,我发现双窗口应用程序(new remote.BrowserWindow()
)的行为与dev工具完全相同
有谁知道如何解决这个问题?
非常感谢提前
答案 0 :(得分:5)
而不是function init return internal_data is
begin
--do something (e.g. read data from a file, perform some initialization calculation, ...)
end function init;
signal data_internal : internal_data := init;
更喜欢使用事件onbeforeunload
。通过此事件,您将能够在整个闭包过程完成之前捕获结束事件(事件close
)。使用closed
,您将能够在需要完成关闭时接受控制并停止。
创建BrowserWindow时可以这样做,最好是在主过程中:
close
此外,请注意函数// Create the browser window.
window = new BrowserWindow({});
// Event 'close'
window.on('close', (e) => {
// Do your control here
if (bToStop) {
e.preventDefault();
}
}
// Event 'closed'
window.on('closed', (e) => {
// Fired only if you didn't run the line e.preventDefault(); above!
}
正在整个代码中传播。如果您需要回到Electron的自然行为,则需要将变量e.preventDefault()
切换为e.defaultPrevented
。
实际上,似乎false
函数正在处理变量e.preventDefault()
到e.defaultPrevented
,直到对其进行任何更改。
答案 1 :(得分:0)
更新:
正如我在上面接受的答案的注释中提到的,preventDefault
在Windows上被忽略。确切地说,我将其放置在用户关闭应用程序时打开的本机电子对话框的回调中。
因此,我采用了另一种方法:
let close: boolean = false
win.on('close', (ev: any) => {
if (close === false) {
ev.preventDefault()
dialog.showMessageBox({
type: 'warning',
buttons: ['Cancel', 'Ok'],
title: 'Do not forget to safe your changes',
cancelId: 0,
defaultId: 1,
noLink: true
}).then((val) => {
if (val.response === 0) {
// Cancel the close process
} else if (win) {
close = true
app.quit()
}
})
}
})