Chrome扩展程序:带有参数的启动选项页面

电动猴子

我的扩展包括四个相关部分。在选项卡中插入的脚本将收集一些数据,该选项卡上的页面操作弹出窗口,在两者之间中介数据的后台脚本,以及选项页面。弹出窗口有一个按钮,用于打开选项页面。

我想从弹出窗口中打开选项页面并提供一些数据,以便它可以显示与该选项卡相关的选项。以下是我为解决此问题而进行的精简和编辑的尝试:

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'权限,我会希望。

谢谢阅读 :)

安尼尔·雷德shift

解决此问题的一种方法是让选项页面调用后台页面以获取相关页面数据。它看起来像这样:

// 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何投射带有Google Cast Chrome扩展程序的HTML页面?

Chrome扩展程序选项

Chrome扩展程序自动刷新选项页面用户界面

chrome扩展程序:启动时停止加载页面

程序参数中带有参数扩展的奇怪行为

Chrome扩展程序中没有检查视图选项

Chrome扩展程序:发布时没有定价选项

关闭Chrome扩展程序选项

捆绑带有特定扩展程序的Chrome

通过chrome扩展程序发送带有post方法的文本

是否可以发送带有Postman Chrome扩展程序的阵列?

更改带有Chrome扩展程序的网站图标?

带有 Chrome 扩展程序的 onClick 不起作用

有没有办法从chrome扩展程序启动chrome打包的应用程序

如何在ocamldebug中启动带有参数的程序?

如何配置 dmenu 以启动带有参数的应用程序?

Chrome扩展程序:加载所有其他页面脚本后运行扩展程序的脚本

在 newtab chrome 扩展中设置选项页面

Chrome扩展程序,扩展程序图标上带有内容脚本

chrome扩展程序中的选项卡更改时的页面内容

Chrome扩展程序弹出窗口和选项页面的默认样式表在哪里?

如何使用新的OptionsV2方法调试Chrome扩展程序的“选项”页面?

点击事件在Chrome扩展程序选项页面中不起作用

使用扩展程序启动Chrome应用

带有SVG图标的Chrome扩展程序(chrome.browserAction.setIcon)

我可以在带有Chrome扩展程序的Chrome中禁用“您已全屏显示”通知吗?

从Google Chrome扩展程序调用页面功能

使用Chrome扩展程序淡出整个页面

如何使用带有多个页面和入口点的React和TypeScript设置chrome扩展?