L'événement beforeunload
dans Electron agit différemment que dans le navigateur. Si je renvoie une chaîne, elle ne s'affiche pas dans une boîte de dialogue de confirmation. J'ai vu que dans BrowserWindow
vous donnez un exemple d'utilisation de beforeunload
et que vous y mentionnez dans un commentaire qu'il est possible d'afficher une boîte de dialogue de confirmation :
// Vous pouvez également utiliser l'API de dialogue pour laisser l'utilisateur confirmer la fermeture de l'application
L'API de dialogue n'est-elle pas disponible uniquement pour le processus principal ?
Quel est le moyen le plus simple de reproduire le comportement normal du navigateur ?
Peu importe. Je l'ai compris.
Pour référence future, voici un exemple :
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;
};
salut(:
la solution indiquée ci-dessus ne fonctionne pas pour moi.
car il faut quand même le "onbeforeunload" du navigateur...
une idée?
@shneorasa Je sais que cela fait quelques mois que vous avez demandé (et vous avez probablement déjà trouvé une solution), mais pour ceux qui recherchent une solution à l'avenir, voici une meilleure façon de gérer ce problème par opposition à l'utilisation de window.onbeforeload
.
L'écrasement beforeunload
événement
// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true
Avec cela, vous pouvez interrompre l'événement close
de votre BrowserWindow
comme suit :
// 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()
}
})
}
})
J'ai implémenté cette solution dans une application Electron à l'aide de Vue.js, et afficher/masquer la boîte de dialogue est aussi simple que d'importer app
:
const { app } = require('electron').remote
et en écrasant la valeur booléenne stockée :
app.showExitPrompt = true
Commentaire le plus utile
@shneorasa Je sais que cela fait quelques mois que vous avez demandé (et vous avez probablement déjà trouvé une solution), mais pour ceux qui recherchent une solution à l'avenir, voici une meilleure façon de gérer ce problème par opposition à l'utilisation de
window.onbeforeload
.L'écrasement
beforeunload
événementAvec cela, vous pouvez interrompre l'événement
close
de votreBrowserWindow
comme suit :J'ai implémenté cette solution dans une application Electron à l'aide de Vue.js, et afficher/masquer la boîte de dialogue est aussi simple que d'importer
app
:et en écrasant la valeur booléenne stockée :