【问题标题】:Electron | onbeforeunload prevents reloading电子 | onbeforeunload 防止重新加载
【发布时间】:2019-02-09 15:39:37
【问题描述】:

我正在尝试开发一个带有单独设置窗口的应用程序(在电子中)。当设置窗口打开并关闭主窗口时,我想阻止关闭主窗口并聚焦设置窗口。

现在我这样做如下:

window.onbeforeunload = e => {
    console.log(e);
    if(settingsWindow) {
        settingsWindow.focus();
        e.returnValue = false;
    }
    else e.returnValue = true;
};

这虽然可以防止重新加载我不想要的窗口。 所以我要求一种不同的预防方法或一种方法来检测它是重新加载还是关闭。

问候埃利亚斯 =)

编辑/解决方案: 利用ipcMainipcRenderer 在主进程中创建窗口来处理所有事情。在那里您可以捕获和阻止close 事件。

MAIN.JS

const {ipcMain} = require("electron");
...
ipcMain.addListener("ASYNC_MSG", (event, arg) => {
    switch(arg) {
        case "OPEN_SETTINGS": createSettingsWindow(); break;
    }
});

...

mainWindow.addListener("close", e => {
    if(settingsWindow) {
        e.preventDefault();
        e.returnValue = false;
        settingsWindow.focus();
    }
    else e.returnValue = true;

});

RENDERER.JS

const {ipcRenderer} = require("electron");
...
ipcRenderer.send("ASYNC_MSG", "OPEN_SETTINGS");

【问题讨论】:

  • 'close' event 怎么样?它被称为 before onbeforeunload 并且不会与重新加载冲突
  • 嗯,是的,但我无法让它工作......不过我找到了解决问题的方法。 =)
  • 添加了“关闭”事件的实现

标签: electron


【解决方案1】:

Soo 经过更多的尝试和错误后,我发现这是可行的:

window.onbeforeunload = e => {
    console.log(e);
    if(settingsWindow) {
        settingsWindow.focus();
        e.returnValue = false;
    }
    - else e.returnValue = true;
    + else window.destroy();
};

很高兴我终于找到了解决方案:)

【讨论】:

  • 是否可以在(我认为它被称为 ^^)渲染器进程中调用它,因为我没有在主进程中初始化我的 settingsWindow 和 remote.getCurrentWindow().addListener("关闭”,...) 似乎不起作用:(。
  • 你如何初始化设置窗口呢? window.open?
  • 实际上没有settingsWindow = new remote.BrowserWindow({...})
  • 然后你可以简单地ipcRenderer.send一个事件到主进程并在那里初始化它以使事情连贯
【解决方案2】:

您可以使用'close' 事件,该事件被称为之前 onbeforeunload,并且不会与重新加载发生冲突

const { app, BrowserWindow } = require('electron')

app.once('ready', () => {
  let main = new BrowserWindow({title: 'main'})
  let settings = new BrowserWindow({title: 'settings'})

  main.on('close', (event) => {
    if (settings) {
      event.preventDefault()
      event.returnValue = false
      settings.focus()
    } else {
      event.returnValue = true
    }
  })
  settings.on('closed', () => {
    settings = null
  })
})

【讨论】:

  • 这是更好的方法吗?如果是这样,我很乐意实施它(查看我的答案)
  • 好吧,如果你也想解决重新加载问题,是的。否则只是风格问题。但是在“正在销毁”的回调中销毁某些东西对我来说并不合适(虽然我不能告诉你确切的副作用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多