2017-08-14 85 views
2

我正在写电子应用程序,如果用户打开未保存的文件,我想在保存之前提示用户。我发现这个示例代码在线:电子阻止主窗口关闭

window.onbeforeunload = (e) => { 
     var answer = confirm('Do you really want to close the application?'); 
     e.returnValue = answer; // this will *prevent* the closing no matter what value is passed 
     if(answer) { mainWindow.destroy(); } // this will close the app 
    }; 

如果对话框是,取消或X按钮被按下时出现的几秒钟内,但如果你让屏幕上的对话框休息了一点,然后点击此代码奇怪的工作无论按下什么按钮,应用程序都将关闭。

此代码位于我的主要脚本文件index.html调用

回答

0

真的很奇怪的行为!我无法解释为什么会发生这种情况,但可以给你一个在主进程中实现的解决方法。

您可以使用电子的dialog模块并创建与电子相同的确认对话框。这一个按预期工作。

main.js

const { app, BrowserWindow, dialog } = require('electron') 
const path = require('path') 

app.once('ready',() => { 
    let win = new BrowserWindow() 
    win.loadURL(path.resolve(__dirname, 'index.html')) 
    win.on('close', e => { 
    let choice = dialog.showMessageBox(
     win, 
     { 
     type: 'question', 
     buttons: ['Yes', 'No'], 
     title: 'Confirm', 
     message: 'Do you really want to close the application?' 
     } 
    ) 
    if (choice === 1) e.preventDefault() 
    }) 
}) 
0

可能可以只有当被激活DevTools窗口。

在任何情况下,宁愿与上面提到的pergy一起处理事件。这是迄今为止最好的方法。

但请注意,e.preventDefault()在代码中随处可见。一旦正确管理preventDefault(),您需要将变量e.defaultPrevented = false变回您应用的自然行为。

实际上,它似乎e.preventDefault()功能是转向变量e.defaultPreventedtrue,直到您更改其值。