Electron: beforeunload์—์„œ ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 07์›” 22์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: electron/electron

Electron์˜ beforeunload ์ด๋ฒคํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”์—์„œ ๊ฒƒ์„๋ณด๊ณ  BrowserWindow ์‚ฌ์šฉ์˜ ์˜ˆ๋ฅผ ์ œ๊ณต beforeunload ํ•˜๊ณ  ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๊ฒฌ์— ์–ธ๊ธ‰ ๊ทธ๊ฒƒ์—๋ฅผ :

// ๋Œ€ํ™” API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‹ซ๊ธฐ๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Dialog API๋Š” ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‚˜์š”?
์ •์ƒ์ ์ธ ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘์„ ๋ณต์ œํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@shneorasa ๊ท€ํ•˜๊ฐ€ ์š”์ฒญํ•œ ์ง€ ๋ช‡ ๊ฐœ์›”์ด window.onbeforeload ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค

beforeunload ์ด๋ฒคํŠธ๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด ํ–ฅํ›„ ๋Œ€ํ™”๊ฐ€ ์—‰๋ง์ด ๋˜์–ด ์•ฑ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์•ฑ ๋‚ด๋ถ€์— ๊ฐ„๋‹จํ•œ ๋ถ€์šธ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด BrowserWindow ์˜ close ์ด๋ฒคํŠธ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Vue.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์†”๋ฃจ์…˜์„ Electron ์•ฑ์— ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ๋Œ€ํ™” ์ƒ์ž ํ‘œ์‹œ/์ˆจ๊ธฐ๊ธฐ๋Š” app ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

์ €์žฅ๋œ ๋ถ€์šธ ๊ฐ’์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

app.showExitPrompt = true

๋ชจ๋“  3 ๋Œ“๊ธ€

๊ดœ์ฐฎ์•„์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„.

๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”(:
์œ„์—์„œ ์„ค๋ช…ํ•œ ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ ๋ธŒ๋ผ์šฐ์ €์˜ "onbeforunload"๋ฅผ ์ทจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ...
์–ด๋–ค ์ƒ๊ฐ?

@shneorasa ๊ท€ํ•˜๊ฐ€ ์š”์ฒญํ•œ ์ง€ ๋ช‡ ๊ฐœ์›”์ด window.onbeforeload ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค

beforeunload ์ด๋ฒคํŠธ๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด ํ–ฅํ›„ ๋Œ€ํ™”๊ฐ€ ์—‰๋ง์ด ๋˜์–ด ์•ฑ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์•ฑ ๋‚ด๋ถ€์— ๊ฐ„๋‹จํ•œ ๋ถ€์šธ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด BrowserWindow ์˜ close ์ด๋ฒคํŠธ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Vue.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์†”๋ฃจ์…˜์„ Electron ์•ฑ์— ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ๋Œ€ํ™” ์ƒ์ž ํ‘œ์‹œ/์ˆจ๊ธฐ๊ธฐ๋Š” app ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

์ €์žฅ๋œ ๋ถ€์šธ ๊ฐ’์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

app.showExitPrompt = true
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰