2017-08-14 130 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,直到您更改其值。