需求:子窗口关闭前,询问是否提交表单?
思路1:渲染进程监听子窗口close事件,阻止默认行为,询问处理后,再关闭窗口
// 以下代码不能实现需求
// remote.getCurrentWindow()的监听close,e.preventDefault()无法阻止窗口关闭,异步
//渲染进程中render.js // 需求:离开前,询问是否提交表单? // 以上代码不能实现需求 // 提交表单 function saveFormAsync(askMessage) { return new Promise((res, rej) =>{ const answer = window.confirm(askMessage) if (!answer) { res() return } //提交表单逻辑部分 res() }) } document.addEventListener('DOMContentLoaded',()=>{ const win = remote.getCurrentWindow() win.on('close', async (e) => { e.preventDefault(); //询问是否提交表单 await saveFormAsync('是否提交本次修改?') win.destory() }) })
以下方案可实现需求
思路2:
- 使用主进程监听close, 阻止默认行为并childwin.webContents.send此事件,
- 渲染进程监听到此事件ipcRenderer后执行询问处理操作后,
- 关闭子窗口remote.getCurrentWindow().destory() [注:destory不会触发close事件]
主进程的close的监听是同步行为,可使用e.preventDefault()来阻止
//主进程 childWin 子窗口
... childWin.on('close', (e) => { e.preventDefault(); childWin.webContents.send('close1') })
...
//渲染进程 ... // 提交表单 function saveFormAsync(askMessage) { new Promise((res, rej) =>{ const answer = window.confirm(askMessage) if (!answer) { res() return } // 提交表单部分逻辑 res() }) } // 监听主进程通知 ipcRenderer.on('close1', async (e) => { await saveFormAsync('是否保存本次修改?') remote.getCurrentWindow().destroy() }) ...