При открытии нового окна / вкладки, какое самое раннее событие, которое я могу прослушать, которое сообщит мне, когда это окно способно получить фокус?
У меня есть веб-приложение, которое открывает несколько нажатых кнопок. вещи в новые вкладки через 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
происходит немного позже, чем я хочу сфокусировать на новой вкладке. Могу ли я прослушать более раннее событие?