Фокус только что открытые вкладки - PullRequest
0 голосов
/ 22 апреля 2020

При открытии нового окна / вкладки, какое самое раннее событие, которое я могу прослушать, которое сообщит мне, когда это окно способно получить фокус?

У меня есть веб-приложение, которое открывает несколько нажатых кнопок. вещи в новые вкладки через window.open , например:

let url = "https://stackoverflow.com/questions/61354349/";
window.open(url,'61354349').focus();

В Chromium новая вкладка сразу получает желаемый фокус, но в Firefox она обрабатывает window.focus как операция asyn c, в которой WindowProxy.focus() отправляется в новое окно / вкладку, прежде чем это окно / вкладка сможет получить фокус.

В этом тестовом примере вы не будете скорее всего сможет воспроизвести проблему; Я могу испытать этот «разрыв фокусировки» только в моей (более интенсивной) производственной среде.

В моей производственной среде, если я вызываю фокус после задержки в 100 миллисекунд (вместо сразу после window.open, это работает, вкладка получает фокус в Firefox 75:

let url = "https://stackoverflow.com/questions/61354349/";
let win = window.open(url,'61354349');
setTimeout(()=>{win.focus();},100);

Мне не нравятся решения, которые ждут определенное количество миллисекунд (на ошибка ), потому что число Необходимые миллисекунды могут варьироваться в зависимости от производительности компьютера.

Если Firefox будет обрабатывать window.open как асинхронную c операцию, то в идеале она должна вернуть обещание, которое в конечном итоге разрешает WindowProxy (один раз окно / вкладка готово), вместо немедленного возврата WindowProxy (это неспособно перевести фокус на окно / вкладку, которая не готова к нему). Однако возврат обещания, очевидно, нарушит существующий код, который находится на inte rnet (возможно, функция, основанная на обещании, должна быть предложена авторам API spe c). Firefox не должен возвращать WindowProxy, пока окно / вкладка не будет готова к повторному использованию. Себе сосредоточиться. Итак, я отправил сообщение об ошибке об этом.

Этого не происходит в Chromium (возможно, потому что Chromium не возвращает WindowProxy, пока новая вкладка не будет готова к получить фокус).

Я ищу обходной путь, основанный на событиях, а не на тайм-ауте; Я ищу событие, которое срабатывает в ту же миллисекунду, что и новая вкладка готова для получения фокуса.

Я пробовал это:

let url = "https://stackoverflow.com/questions/61354349/";
let win = window.open(url,'61354349');
win.addEventListener('DOMContentLoaded', function()
{
    win.focus();
});

Это работает. Однако событие DOMContentLoaded происходит немного позже, чем я хочу сфокусировать на новой вкладке. Могу ли я прослушать более раннее событие?

...