我的扩展包括四个相关部分。在选项卡中插入的脚本将收集一些数据,该选项卡上的页面操作弹出窗口,在两者之间中介数据的后台脚本,以及选项页面。弹出窗口有一个按钮,用于打开选项页面。
我想从弹出窗口中打开选项页面并提供一些数据,以便它可以显示与该选项卡相关的选项。以下是我为解决此问题而进行的精简和编辑的尝试:
popup.js
var popup = (function() {
var tabId;
function openOptions() {
port.postMessage({
action: 'openOptions',
id: tabId
});
}
function connectToBackground(tabs) {
if (tabs.length > 0) {
tabId = tabs[0].id;
port = chrome.runtime.connect();
port.postMessage({
action: 'connect',
id: tabId
});
}
}
return {
initialize: function() {
document.getElementById('settings').addEventListener('click', openOptions);
chrome.tabs.query({active: true, currentWindow: true}, connectToBackground);
}
};
})();
popup.initialize();
background.js
var background = (function() {
var tabs = {};
return {
onConnectInjected: function(port) {
chrome.pageAction.show(port.sender.tab.id);
port.onMessage.addListener(function(message, port) {
if (message.action === 'connect') {
if (!tabs[port.sender.tab.id]) {
tabs[port.sender.tab.id] = {};
}
tabs[port.sender.tab.id].injected = port;
tabs[port.sender.tab.id].tabData = message.data;
}
});
port.onDisconnect.addListener(function() {
tabs[port.sender.tab.id].injected = null;
});
},
onConnectPopup: function(port) {
port.onMessage.addListener(function(message) {
if (message.action === 'openOptions') {
chrome.runtime.openOptionsPage(function() {
for (let view of chrome.extension.getViews()) {
if (view.options) {
view.options.showOptionsRelevantToTab(tabs[message.id].tabData);
}
}
});
} else if (message.action === 'connect') {
if (!tabs[message.id]) {
tabs[message.id] = {};
}
tabs[message.id].popup = port;
port.onDisconnect.addListener(function(port) {
tabs[message.id].popup = null;
});
}
});
}
};
})();
chrome.runtime.onConnectExternal.addListener(background.onConnectInjected);
chrome.runtime.onConnect.addListener(background.onConnectPopup);
options.js
var options = (function() {
return {
showDefaultOptions: function() {
},
showOptionsRelevantToTab: function(data) {
}
};
})();
options.showDefaultOptions();
魔术应该发生在background.js的回调中chrome.runtime.openOptionsPage
。据我所知,当成功打开选项页面但chrome.extension.getViews()
仅返回背景视图(奇怪的是弹出视图)时,将调用此回调。
我尝试直接从弹出窗口中打开选项页面,但是由于选项是在另一个选项卡中打开的,因此弹出窗口失去焦点并关闭,因此回调永远不会触发。我还探讨了从选项页向后台脚本发送消息的方法,但是background.js无法确定知道哪个选项卡产生了选项页。
我还测试了在options.js中调用getViews,它实际上返回了弹出窗口(反过来可以提供数据),但是鉴于弹出窗口同时退出,因此我不确定这是一致的。
再说一次,background.js如何在创建时获取选项页面的window对象,以便可以为其提供相关数据,或者-让settings.js知道哪个标签创建了它,以便它可以从后台获取相关数据。 js。如果我不必为此添加'tabs'权限,我会希望。
谢谢阅读 :)
解决此问题的一种方法是让选项页面调用后台页面以获取相关页面数据。它看起来像这样:
// options.js init code:
chrome.runtime.sendMessage({action: "getOptionsData"}, (response) => {
// Now that you have the response, you can set your settings and then make the page visible
});
在您的background.js中,您需要进行处理。最简单的方法是保存optionsState
要在openOptions
处理程序中设置的全局变量,然后将数据返回到getOptionsData
这不应该成为问题,因为在您的示例中不应打开多个选项卡。
例如
// at the top of background.js
let optionsData = null;
// inside openOptions, before calling openOptionsPage,
optionsData = tabs[message.id].tabData;
// inside getOptionsData (make sure to expose sendResponse as a function param
return sendResponse(optionsData);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句