Electron: Как отобразить диалог подтверждения перед выгрузкой?

Созданный на 22 июл. 2015  ·  3Комментарии  ·  Источник: electron/electron

Событие beforeunload в Electron действует иначе, чем в браузере. Если я возвращаю строку, она не отображается в диалоговом окне подтверждения. Я видел, что в BrowserWindow вы даете пример использования beforeunload и в нем вы упоминаете в комментарии, что можно отобразить диалоговое окно подтверждения:

// Вы также можете использовать API диалога, чтобы пользователь мог подтвердить закрытие приложения

Разве API диалога не доступен только для основного процесса?
Какой самый простой способ воспроизвести нормальное поведение браузера?

Самый полезный комментарий

@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

Все 3 Комментарий

Неважно. Я понял.

Для справки в будущем, вот пример:

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
Была ли эта страница полезной?
0 / 5 - 0 рейтинги