Electron: Bagaimana cara menampilkan dialog konfirmasi pada beforeunload?

Dibuat pada 22 Jul 2015  ·  3Komentar  ·  Sumber: electron/electron

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?

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:

// 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

Semua 3 komentar

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat