在Electron中确认前载

时间:2017-08-22 22:05:23

标签: javascript electron onbeforeunload confirm

我知道有数百个问题如下:"我如何防止电子中的近距离事件?或类似的东西。
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工具完全相同

有谁知道如何解决这个问题?
非常感谢提前

2 个答案:

答案 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()
      }
    })
  }

})