火狐附加组件:如何判断窗口是否在后台
Firefox add-on: how to tell if a window is in the background
在 Firefox 附加组件 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
用于避免快速连续多次调用刷新 TabState。例如,如果您单击不是当前窗口的非活动选项卡,则单击该一次会导致window.deactivate
、window.activate
和tab.activate
事件。
此外,初始状态也是一个问题。如果用户启动 Firefox 并在任何脚本设法运行之前将其置于后台怎么办?
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 防止Iframe窗体在新窗口中打开
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 调整窗口大小时,可拖动的对象会出现在容器外部
- Javascript排序的图像弹出窗口..可以't单独弹出
- 窗口大小html css
- 弹出窗口出现,然后退出
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- Javascript更新孙窗口中的表单元素
- 如何在选项卡上定义属性'的主窗口对象
- CSS-若窗口太小,滚动条会出现在“表格”单元格上
- 召回窗口加载事件 - javascript
- 为什么不显示警报窗口
- 如何使用modalDialog来显示可以在所有浏览器中工作的弹出窗口
- 如何通过溢出来判断元素被切断了多少像素:隐藏在父级上
- Chrome应用程序调整窗口大小保持纵横比
- 如何判断函数是在已关闭或重新加载的窗口中定义的
- 火狐附加组件:如何判断窗口是否在后台
- 如何判断要显示哪个JQUERY弹出窗口
- 如何使用 GJS 判断窗口是否最小化