我正在尝试创建一个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。
答案 0 :(得分:0)
如果您想要的是TAB使自己专注,那么您错误的是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"))