Javascript 如何使用Web扩展设置Firefox窗口的焦点

Javascript 如何使用Web扩展设置Firefox窗口的焦点,javascript,firefox,firefox-addon-webextensions,Javascript,Firefox,Firefox Addon Webextensions,我正在尝试创建一个Firefox插件,每当触发一个给定事件时,它都会将浏览器窗口置于最前沿 这是我的舱单: { "manifest_version": 2, "name": "Test Extension", "version": "1.0", "description": "Test browser extension", "content_scripts": [{ "matches": ["http://*/*", "https://*/*"], "js

我正在尝试创建一个Firefox插件,每当触发一个给定事件时,它都会将浏览器窗口置于最前沿

这是我的舱单:

{
  "manifest_version": 2,
  "name": "Test Extension",
  "version": "1.0",
  "description": "Test browser extension",

  "content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "js": ["content.js"]
  }],

  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },

  "permissions": [
    "notifications",
    "activeTab"
  ]
}
Content.js:

'use strict';

document.addEventListener('newOrderEvent', function() {
  console.log('New Order event received');
  browser.runtime.sendMessage('new-order-event');
});
Background.js:

'use strict';

var windowId;

function newOrderListener(message) {
  if (message === 'new-order-event') {
    console.log('Received event!');
    browser.windows.update(windowId, {
      drawAttention: true,
      focused: true,
      state: 'maximized'
    });
  }
}

browser.windows.getCurrent().then(function(window) {
  windowId = window.id;
});

browser.runtime.onMessage.addListener(newOrderListener);
newOrderEvent
是由我的应用程序的网页生成的,它总是在正确的时间被调用,但有时浏览器会出现在前台,有时则不会出现,我不知道确切的原因。此外,浏览器未注册background.js的控制台输出

我做错了什么


注意:我使用的是Firefox 52和Windows 10。

如果您想要的是一个选项卡,使其自身成为焦点,那么您就错认为windowId是什么。WindowId将是窗口的ID,而不是选项卡的ID,按照您设置它的方式,它将永远只是一个值,即加载扩展时的第一个WindowId

如果将background.js更改为以下内容

function newOrderListener(message, sender) {
    if (message === 'new-order-event') {
        console.log('Received event for window %s, tab %s', sender.tab.windowId, sender.tab.id);
        browser.windows.update(sender.tab.windowId, {
            drawAttention: true, 
            focused: true, 
            state: 'maximized'}
        ).then(() => browser.tabs.update(sender.tab.id, {
            active: true
        }));
    }
}
browser.runtime.onMessage.addListener(newOrderListener);
然后,任何加载了内容脚本的选项卡(基本上是代码中的每个选项卡)都可以通过

document.dispatchEvent(new Event("newOrderEvent"))

1:您在“安装”扩展时是否收到任何警告?2:浏览器控制台(Ctrl+Shift+J)明确显示了所有控制台。日志3:您在
background.js中使用
windowId
看起来有误,一根手指都插不上是的,不,我没有收到任何警告。。。我还使用了
Ctrl+Shift+J
控制台和
console.log()
命令,现在出现了…您好,感谢您的回答,您的代码看起来确实更好,我喜欢不必使用承诺来获得
windowId
,但是它仍然不起作用。有时候它会把浏览器放在前台,而有时候浏览器只会在状态栏上闪烁。。。你在用Windows吗?注意:我也一直在尝试其他插件,如果我将浏览器设置为“始终在顶部”,那么这段代码对我来说是有效的。。。