当我调用win.loadFile(..)

时间:2019-07-04 18:37:15

标签: electron focus

在我的Electron设置中,一旦应用加载,我会显示一个基于Web的登录屏幕。它位于可填充应用程序屏幕空间的BrowserView内。通过这种方法,我可以为登录页面禁用nodeIntegration(因为它需要jQuery,当nodeIntegration为true时将不可用),同时保持对我的主应用程序启用。

但是我注意到从关闭登录视图到加载主应用程序的时间有所延迟。例如可能需要2-5秒。

要消除这种延迟,我开始使用'did-finish-load'事件预加载主应用程序。这意味着当出现登录屏幕时,我可以在“后台”中加载主应用程序。

但是,我遇到了BrowserView失去焦点的问题。这意味着用户需要手动单击登录输入。在我将通话添加到win.loadFile('index.html')之后,这种情况开始发生。

到目前为止,我已经能够通过在主应用加载后将焦点传递给BrowserView来减轻这种情况。但这并不完美,因为在短暂的停滞时间内会忽略键盘输入。

是否有更好的解决方法?我的代码在下面。

const win = new BrowserWindow({
    width: 605, height: 550,
    minWidth: 605, minHeight: 550,
    useContentSize: true,
    maximizable: false,
    title: "My Window"
})

const view = new BrowserView({
    webPreferences: {
      // Enables support for jQuery and others by disabling nodeIntegration in this BrowserView
      nodeIntegration: false,
    }
})

win.setBrowserView(view)
view.setAutoResize({ width: true, height: true})
view.setBounds({ x: 0, y: 0, width: win.getContentBounds().width, height: win.getContentBounds().height })

view.webContents.loadURL('my login url')

view.webContents.once('did-finish-load', () => {
    // Load the main view in the background. This means it'll be available immediately when the login view closes.
    // But it also steals focus from the view so...
    win.loadFile('index.html')

    // Best fix so far but not perfect
    win.webContents.on('did-finish-load', () => view.webContents.focus())
})

view.webContents.on('login-complete-made-up-event', async (event) => {
    // Close the login page to show the main view
    view.destroy()
    // Set the focus onto the main view
    win.webContents.focus()
})

1 个答案:

答案 0 :(得分:0)

修复非常简单。今天早上5分钟内偶然发现了它。

view.webContents.once('did-finish-load', () => {
    // Load the main view in the background. This means it'll be available immediately when the login view closes.
    win.loadFile('index.html')

    // Place focus on the view for keyboard input. i.e. Otherwise the user needs to click.
    // Do this after loading index.html as the loadFile(..) steals focus
    view.webContents.focus()
})