Electron BrowserView теряет фокус, когда я вызываю win.loadFile (..) - PullRequest
0 голосов
/ 04 июля 2019

В моей настройке Electron я показываю веб-экран входа в систему после загрузки приложения.Он размещен в 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 голосов
/ 05 июля 2019

Исправление было довольно простым. Наткнулся на него в течение 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()
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...