electron 电子防止多次打开同一窗口

xzabzqsa  于 2023-06-04  发布在  Electron
关注(0)|答案(1)|浏览(846)

我正在开发一个电子应用程序,其中包括几个单独的窗口。我正在使用按钮单击事件打开新窗口并调用window.open方法。问题是,如果我多次点击按钮,每次打开的窗口都是相同的。我想防止打开同一个窗口不止一次。
这是单击事件调用。

window.open('settings.html', '_blank');

这是settings.html页面的配置。

mainWindow.webContents.setWindowOpenHandler(({ url }) => {
  if (path.basename(url) === 'settings.html') {
    return {
      action: 'allow',
      overrideBrowserWindowOptions: {
        width: 400,
        height: 450,
        autoHideMenuBar: true,
        fullscreenable: false,
        webPreferences: {
          preload: path.join(__dirname, 'js', 'preload.js')
        }
      }
    }
  }
  return { action: 'deny' }
});

当前位于createWindow()函数中的配置。

  • 电子版本为24.4*
t5fffqht

t5fffqht1#

你可以试着用IPC来处理。在renderer中调用ipcRenderer.invoke("open-window", url),在main中调用ipcMain.handle("open-window", (event, url) => {...})。在main中,您有const browserWindows = [],您可以在其中存储到目前为止打开的浏览器Windows。在ipcMain.handle()中,检查browserWindows数组是否已打开浏览器窗口,如果是:不要再打开一个。如果没有:用new BrowserWindow(...)打开一个新的,并将其添加到browserWindows数组中。使渲染器的点击处理程序异步,这样你就可以在ipcMain仍然需要处理你的打开请求的时候做一些类似的事情来防止多次点击(但也许这不是必要的):

async onClick() {
  buttonDisabled = true;
  await ipcRenderer.invoke("open-window", url);
  buttonDisabled = false;
}

https://www.electronjs.org/docs/latest/tutorial/ipc
您可能需要一些额外的逻辑,以便在browserWindows从browserWindows数组中关闭时将其删除。
或者你也可以在setWindowOpenHandler中完成所有这些,而不是使用ipc。例如,您可以创建一个windowUrls数组并检查它,而不是browserWindows数组。

相关问题