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?
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
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:Damit kannst du das
close
Event deinesBrowserWindow
wie folgt unterbrechen: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
:und den gespeicherten booleschen Wert überschreiben: