Electron: Wie zeige ich den Bestätigungsdialog vor dem Entladen an?

Erstellt am 22. Juli 2015  ·  3Kommentare  ·  Quelle: electron/electron

Das beforeunload Event in Electron verhält sich anders als im Browser. Wenn ich eine Zeichenfolge zurückgebe, wird sie nicht in einem Bestätigungsdialog angezeigt. Ich habe gesehen, dass Sie in BrowserWindow ein Beispiel für die Verwendung von beforeunload und darin in einem Kommentar erwähnen, dass es möglich ist, einen Bestätigungsdialog anzuzeigen:

// Sie können auch die Dialog-API verwenden, um den Benutzer das Schließen der Anwendung bestätigen zu lassen

Ist die Dialog-API nicht nur für den Hauptprozess verfügbar?
Was ist der einfachste Weg, um das normale Browserverhalten zu replizieren?

Hilfreichster Kommentar

@shneorasa Ich weiß, es ist ein paar Monate her, seit Sie gefragt haben (und Sie haben wahrscheinlich inzwischen eine Lösung gefunden), aber für diejenigen, die in Zukunft nach einer Lösung suchen, ist dies eine bessere Möglichkeit, dieses Problem zu lösen, als window.onbeforeload .

Das Überschreiben des beforeunload Ereignisses kann möglicherweise zukünftige Dialoge durcheinander bringen und Ihre App beschädigen. Stattdessen können Sie einen einfachen booleschen Wert in Ihrer App speichern, wie ich es getan habe:

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

Damit kannst du das close Event deines BrowserWindow wie folgt unterbrechen:

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

Ich habe diese Lösung mit Vue.js in eine Electron-App implementiert, und das Ein- / Ausblenden des Dialogfelds ist so einfach wie das Importieren von app :

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

und den gespeicherten booleschen Wert überschreiben:

app.showExitPrompt = true

Alle 3 Kommentare

Macht nichts. Ich habe es herausgefunden.

Zur späteren Bezugnahme hier ein Beispiel:

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

Hi(:
die oben genannte Lösung funktioniert bei mir nicht.
denn es dauert noch das "onbeforeunload" des Browsers...
irgendeine Idee?

@shneorasa Ich weiß, es ist ein paar Monate her, seit Sie gefragt haben (und Sie haben wahrscheinlich inzwischen eine Lösung gefunden), aber für diejenigen, die in Zukunft nach einer Lösung suchen, ist dies eine bessere Möglichkeit, dieses Problem zu lösen, als window.onbeforeload .

Das Überschreiben des beforeunload Ereignisses kann möglicherweise zukünftige Dialoge durcheinander bringen und Ihre App beschädigen. Stattdessen können Sie einen einfachen booleschen Wert in Ihrer App speichern, wie ich es getan habe:

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

Damit kannst du das close Event deines BrowserWindow wie folgt unterbrechen:

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

Ich habe diese Lösung mit Vue.js in eine Electron-App implementiert, und das Ein- / Ausblenden des Dialogfelds ist so einfach wie das Importieren von app :

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

und den gespeicherten booleschen Wert überschreiben:

app.showExitPrompt = true
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen