Acara beforeunload
di Electron, bertindak berbeda dari di browser. Jika saya mengembalikan string, itu tidak ditampilkan dalam dialog konfirmasi. Saya melihat bahwa di BrowserWindow
Anda memberikan contoh penggunaan beforeunload
dan di dalamnya Anda menyebutkan dalam komentar bahwa dimungkinkan untuk menampilkan dialog konfirmasi:
// Anda juga dapat menggunakan API dialog untuk memungkinkan pengguna mengonfirmasi penutupan aplikasi
Bukankah API dialog hanya tersedia untuk proses utama?
Apa cara paling sederhana untuk meniru perilaku browser normal?
Lupakan. Saya menemukan jawabannya.
Untuk referensi di masa mendatang, berikut ini contohnya:
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;
};
Hai(:
solusi yang disebutkan di atas tidak berfungsi untuk saya.
karena masih mengambil "onbeforeunload" dari browser...
ada ide?
@shneorasa Saya tahu sudah beberapa bulan sejak Anda bertanya (dan Anda mungkin sudah menemukan solusi sekarang), tetapi bagi mereka yang mencari solusi di masa mendatang, inilah cara yang lebih baik dalam menangani masalah ini daripada menggunakan window.onbeforeload
.
Acara beforeunload
yang ditimpa dapat berpotensi mengacaukan dialog di masa mendatang, merusak aplikasi Anda. Sebagai gantinya, Anda dapat menyimpan boolean sederhana di dalam aplikasi Anda seperti yang telah saya lakukan:
// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true
Dengan itu, Anda dapat menginterupsi acara close
dari BrowserWindow
sebagai berikut:
// 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()
}
})
}
})
Saya telah mengimplementasikan solusi ini ke dalam aplikasi Electron menggunakan Vue.js, dan menampilkan/menyembunyikan dialog semudah mengimpor app
:
const { app } = require('electron').remote
dan menimpa nilai boolean yang disimpan:
app.showExitPrompt = true
Komentar yang paling membantu
@shneorasa Saya tahu sudah beberapa bulan sejak Anda bertanya (dan Anda mungkin sudah menemukan solusi sekarang), tetapi bagi mereka yang mencari solusi di masa mendatang, inilah cara yang lebih baik dalam menangani masalah ini daripada menggunakan
window.onbeforeload
.Acara
beforeunload
yang ditimpa dapat berpotensi mengacaukan dialog di masa mendatang, merusak aplikasi Anda. Sebagai gantinya, Anda dapat menyimpan boolean sederhana di dalam aplikasi Anda seperti yang telah saya lakukan:Dengan itu, Anda dapat menginterupsi acara
close
dariBrowserWindow
sebagai berikut:Saya telah mengimplementasikan solusi ini ke dalam aplikasi Electron menggunakan Vue.js, dan menampilkan/menyembunyikan dialog semudah mengimpor
app
:dan menimpa nilai boolean yang disimpan: