gpt4 book ai didi

javascript - 火狐浏览器插件: how to tell if a window is in the background

转载 作者:行者123 更新时间:2023-11-28 07:45:50 25 4
gpt4 key购买 nike

在 Firefox Add-on SDK 附加组件中,如何判断窗口是否在后台,即。可见但不聚焦?

例如,如果我将另一个应用程序置于前台,Firefox 窗口将失去焦点,但仍然可见。

我想要这样做的原因是因为我有一个在事件窗口中运行的 CPU 密集型内容脚本,并且我想暂停它以避免用户没有主动使用该窗口时产生不必要的开销- 意味着它在后台或最小化。

require("sdk/windows").activeWindow 不断返回最后单击的窗口,即使它位于后台或最小化。窗口的焦点状态似乎没有任何属性。

我还可以使用以下代码来获取 nsIDocShell:

var mostRecentWindow = require("sdk/window/utils").getMostRecentBrowserWindow();
var docShell = require("sdk/window/utils").getWindowDocShell(mostRecentWindow);

现在,当我查询 docShell.isActive 属性时,即使窗口位于后台,它也会返回 true。

docShell.isActive 的一个优点是,当窗口最小化时它返回 false,而 activeWindow 即使在这种情况下也返回 true。但它仍然缺少有关窗口是否在后台的信息。

最佳答案

根据@willlma的建议,这段代码似乎可以解决问题:

const windows = require('sdk/windows').browserWindows;
const tabs = require("sdk/tabs");
var anyWindowActive = true;
var refreshTimeoutId;

windows.on('deactivate', function(window) {
if (window == windows.activeWindow) {
anyWindowActive = false;
}
clearTimeout(refreshTimeoutId);
refreshTimeoutId = setTimeout(refreshTabStates, 50);
});

windows.on('activate', function(window) {
anyWindowActive = true;
clearTimeout(refreshTimeoutId);
refreshTimeoutId = setTimeout(refreshTabStates, 50);
});

tabs.on('activate', function(tab) {
clearTimeout(refreshTimeoutId);
refreshTimeoutId = setTimeout(refreshTabStates, 50);
});

function refreshTabStates() {
refreshTimeoutId = null;
for (let win of windows) {
for (let tab of win.tabs) {
var shouldBeActive = anyWindowActive
&& tab == tabs.activeTab
&& win == windows.activeWindow;
notifyTab(tab, shouldBeActive);
}
}
}

其中 notifyTab() 是一个函数,用于向该选项卡的内容脚本(如果有)发送一条消息,告知该脚本是否应该运行。

setTimeout 用于避免快速连续多次调用刷新TabStates。例如,如果您单击非当前窗口中的非事件选项卡,则该单击会生成 window.deactivatewindow.activatetab .activate 事件。

此外,初始状态也是一个问题。如果用户在任何脚本成功运行之前启动 Firefox 并将其置于后台会怎样?

关于javascript - 火狐浏览器插件: how to tell if a window is in the background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com