Electron: Como exibir a caixa de diálogo de confirmação em beforeunload?

Criado em 22 jul. 2015  ·  3Comentários  ·  Fonte: electron/electron

O evento beforeunload no Electron atua de forma diferente do que no navegador. Se eu retornar uma string, ela não será exibida em uma caixa de diálogo de confirmação. Eu vi que em BrowserWindow você dá um exemplo do uso de beforeunload e nele você menciona em um comentário que é possível exibir uma caixa de diálogo de confirmação:

// Você também pode usar a API de diálogo para permitir que o usuário confirme o fechamento do aplicativo

A API de diálogo não está disponível apenas para o processo principal?
Qual é a maneira mais simples de replicar o comportamento normal do navegador?

Comentários muito úteis

@shneorasa Eu sei que já se passaram alguns meses desde que você perguntou (e você provavelmente encontrou uma solução agora), mas para aqueles que procuram uma solução no futuro, aqui está uma maneira melhor de lidar com esse problema em vez de usar window.onbeforeload .

O evento beforeunload sendo sobrescrito pode potencialmente bagunçar diálogos futuros, quebrando seu aplicativo. Em vez disso, você pode armazenar um booleano simples dentro do seu aplicativo como eu fiz:

// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true

Com isso, você pode interromper o evento close do seu BrowserWindow seguinte maneira:

// 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()
            }
        })
    }
})

Implementei esta solução em um aplicativo Electron usando Vue.js e mostrar / ocultar a caixa de diálogo é tão simples quanto importar app :

const { app } = require('electron').remote

e sobrescrevendo o valor booleano armazenado:

app.showExitPrompt = true

Todos 3 comentários

Esquece. Eu descobri.

Para referência futura, aqui está um exemplo:

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;
};

Oi(:
a solução declarada acima não funciona para mim.
porque ainda leva o "onbeforeunload" do navegador ...
qualquer ideia?

@shneorasa Eu sei que já se passaram alguns meses desde que você perguntou (e você provavelmente encontrou uma solução agora), mas para aqueles que procuram uma solução no futuro, aqui está uma maneira melhor de lidar com esse problema em vez de usar window.onbeforeload .

O evento beforeunload sendo sobrescrito pode potencialmente bagunçar diálogos futuros, quebrando seu aplicativo. Em vez disso, você pode armazenar um booleano simples dentro do seu aplicativo como eu fiz:

// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true

Com isso, você pode interromper o evento close do seu BrowserWindow seguinte maneira:

// 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()
            }
        })
    }
})

Implementei esta solução em um aplicativo Electron usando Vue.js e mostrar / ocultar a caixa de diálogo é tão simples quanto importar app :

const { app } = require('electron').remote

e sobrescrevendo o valor booleano armazenado:

app.showExitPrompt = true
Esta página foi útil?
0 / 5 - 0 avaliações