如何在浏览器扩展中更改另一个 window 上的活动标签?
How to change the active a tab on another window in a browser extension?
我正在尝试开发 Firefox 扩展程序。我想转到另一个 window 上的浏览器选项卡。正如我从 Firefox 浏览器扩展 API 中了解到的那样,我可以更改焦点 window 并且我可以分别更改焦点 window 上的活动选项卡。因此,我将下面的代码写到我的后台脚本中来实现这一点。但是,当我使用此代码时,浏览器首先将焦点更改为 window 和 window 的先前活动选项卡,然后激活我想要在 window 上的选项卡。此行为会导致故障感觉。
browser.windows.update(windowId, {focused:true})
browser.tabs.update(tabId,{active:true})
你能建议我在一次操作中转到另一个 window 上的特定选项卡的方法吗?
提前致谢!
遗憾的是,仅通过一次操作没有办法做到这一点,所以我认为您需要先激活标签,然后在激活标签后将注意力集中到 window,例如:
async function focusToTab(tabId) {
const tab = await browser.tabs.get(tabId);
if (!tab.active)
await new Promise(resolve => {
const listener = activeInfo => {
if (activeInfo.tabId != tabId)
return;
browser.tabs.onActivated.removeListener(listener);
resolve();
};
browser.tabs.onActivated.addListener(listener)
browser.tabs.update(tabId, { active: true });
});
browser.windows.update(tab.windowId, { focused: true });
}
focusToTab(1);
由于 Piro 启发我首先激活选项卡并更改 window 的焦点,我尝试了下面的两个代码片段。但是,在这两个选项卡中,选项卡激活都跟不上 windows 焦点变化,并导致同样的故障感觉。
browser.tabs.update(tabId,{active:true})
browser.windows.update(windowId, {focused:true})
browser.tabs.update(tabId,{active:true}).then(() =>
browser.windows.update(windowId, {focused:true})
)
最后,我刚刚实现了以下功能,它在更改 window 焦点之前会休眠一段时间。通过将睡眠持续时间优化为 50 毫秒,我获得了流畅的体验。
browser.tabs.update(audibleTabs[0].id,{active:true})
setTimeout(() =>
browser.windows.update(window.id, {focused:true})
, 50);
Chrome 编辑:我尝试 运行 我在 Chrome 上的分机,发现 50 毫秒的睡眠对于 Chrome 来说是不够的。因此,我将 Chrome.
的休眠时间优化为 150ms
我正在尝试开发 Firefox 扩展程序。我想转到另一个 window 上的浏览器选项卡。正如我从 Firefox 浏览器扩展 API 中了解到的那样,我可以更改焦点 window 并且我可以分别更改焦点 window 上的活动选项卡。因此,我将下面的代码写到我的后台脚本中来实现这一点。但是,当我使用此代码时,浏览器首先将焦点更改为 window 和 window 的先前活动选项卡,然后激活我想要在 window 上的选项卡。此行为会导致故障感觉。
browser.windows.update(windowId, {focused:true})
browser.tabs.update(tabId,{active:true})
你能建议我在一次操作中转到另一个 window 上的特定选项卡的方法吗?
提前致谢!
遗憾的是,仅通过一次操作没有办法做到这一点,所以我认为您需要先激活标签,然后在激活标签后将注意力集中到 window,例如:
async function focusToTab(tabId) {
const tab = await browser.tabs.get(tabId);
if (!tab.active)
await new Promise(resolve => {
const listener = activeInfo => {
if (activeInfo.tabId != tabId)
return;
browser.tabs.onActivated.removeListener(listener);
resolve();
};
browser.tabs.onActivated.addListener(listener)
browser.tabs.update(tabId, { active: true });
});
browser.windows.update(tab.windowId, { focused: true });
}
focusToTab(1);
由于 Piro 启发我首先激活选项卡并更改 window 的焦点,我尝试了下面的两个代码片段。但是,在这两个选项卡中,选项卡激活都跟不上 windows 焦点变化,并导致同样的故障感觉。
browser.tabs.update(tabId,{active:true})
browser.windows.update(windowId, {focused:true})
browser.tabs.update(tabId,{active:true}).then(() =>
browser.windows.update(windowId, {focused:true})
)
最后,我刚刚实现了以下功能,它在更改 window 焦点之前会休眠一段时间。通过将睡眠持续时间优化为 50 毫秒,我获得了流畅的体验。
browser.tabs.update(audibleTabs[0].id,{active:true})
setTimeout(() =>
browser.windows.update(window.id, {focused:true})
, 50);
Chrome 编辑:我尝试 运行 我在 Chrome 上的分机,发现 50 毫秒的睡眠对于 Chrome 来说是不够的。因此,我将 Chrome.
的休眠时间优化为 150ms