首页 > 解决方案 > 聚焦新打开的标签

问题描述

打开新窗口/选项卡时,我可以监听的最早事件是什么,这会告诉我该窗口何时能够接收焦点?

我有一个 Web 应用程序,它通过window.open将一些点击的内容打开到新选项卡中,如下所示:

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

在 Chromium 中,新选项卡会根据需要立即获得焦点,但在 Firefox 中,它被视为window.focus异步操作,即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像异步操作一样对待,那么理想情况下,它将返回一个最终解决 a 的承诺WindowProxy(一旦窗口/选项卡准备好),而不是WindowProxy立即返回 a (无法将焦点分派到一个窗口/选项卡还没准备好)。但是,返回一个 Promise 显然会破坏 Internet 上的现有代码(也许应该向 API 规范编写者提出一个基于 Promise 的函数)。WindowProxy在窗口/选项卡准备好接收焦点之前,Firefox 不应返回。所以,我已经提交了关于这个的错误报告。

这在 Chromium 中不会发生(可能是因为 ChromiumWindowProxy在新选项卡实际上准备好接收焦点之前不会返回)。

我正在寻找一种由事件驱动而不是基于超时的解决方法;我正在寻找一个触发与新选项卡准备接收焦点相同毫秒的事件。

我试过这个:

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

这行得通。但是,该DOMContentLoaded事件发生的时间比我想要关注新选项卡的时间要晚一些。有没有我可以听的更早的事件?

标签: javascriptasynchronousfirefoxw3cecmascript-next

解决方案


推荐阅读