Событие beforeunload
в Electron действует иначе, чем в браузере. Если я возвращаю строку, она не отображается в диалоговом окне подтверждения. Я видел, что в BrowserWindow
вы даете пример использования beforeunload
и в нем вы упоминаете в комментарии, что можно отобразить диалоговое окно подтверждения:
// Вы также можете использовать API диалога, чтобы пользователь мог подтвердить закрытие приложения
Разве API диалога не доступен только для основного процесса?
Какой самый простой способ воспроизвести нормальное поведение браузера?
Неважно. Я понял.
Для справки в будущем, вот пример:
window.onbeforeunload = function(e) {
var remote = require('remote');
var dialog = remote.require('dialog');
var choice = dialog.showMessageBox(
remote.getCurrentWindow(),
{
type: 'question',
buttons: ['Yes', 'No'],
title: 'Confirm',
message: 'Are you sure you want to quit?'
});
return choice === 0;
};
Привет(:
указанное выше решение не работает для меня.
потому что это все еще требует "onbeforeunload" браузера ...
любая идея?
@shneorasa Я знаю, что прошло несколько месяцев с тех пор, как вы спросили (и вы, вероятно, уже нашли решение), но для тех, кто ищет решение в будущем, вот лучший способ решения этой проблемы, чем использование window.onbeforeload
.
beforeunload
события
// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true
При этом вы можете прервать событие close
вашего BrowserWindow
следующим образом:
// Inside main/index.js, where BrowserWindow is initialized
mainWindow.on('close', (e) => {
if (app.showExitPrompt) {
e.preventDefault() // Prevents the window from closing
dialog.showMessageBox({
type: 'question',
buttons: ['Yes', 'No'],
title: 'Confirm',
message: 'Unsaved data will be lost. Are you sure you want to quit?'
}, function (response) {
if (response === 0) { // Runs the following if 'Yes' is clicked
app.showExitPrompt = false
mainWindow.close()
}
})
}
})
Я реализовал это решение в приложении Electron с помощью Vue.js, и показать / скрыть диалоговое окно так же просто, как импортировать app
:
const { app } = require('electron').remote
и перезапись сохраненного логического значения:
app.showExitPrompt = true
Самый полезный комментарий
@shneorasa Я знаю, что прошло несколько месяцев с тех пор, как вы спросили (и вы, вероятно, уже нашли решение), но для тех, кто ищет решение в будущем, вот лучший способ решения этой проблемы, чем использование
window.onbeforeload
.beforeunload
событияПри этом вы можете прервать событие
close
вашегоBrowserWindow
следующим образом:Я реализовал это решение в приложении Electron с помощью Vue.js, и показать / скрыть диалоговое окно так же просто, как импортировать
app
:и перезапись сохраненного логического значения: