首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在弹出窗口中与background.js进行交互?

问如何在弹出窗口中与background.js进行交互?
EN

Stack Overflow用户
提问于 2012-03-03 01:09:50
回答 3查看 15.8K关注 0票数 10

有没有办法在popup.html (或popup.js)和后台脚本之间传递信息?

我希望弹出窗口显示用户帐户的信息或允许他们登录,但让background.js处理身份验证和其他逻辑。我在清单中声明了background.js,但似乎没有任何迹象表明它正在被使用。

编辑:如果我把这一切都搞错了,有更好的方法去做,那也太好了。

EN

回答 3

Stack Overflow用户

发布于 2012-03-03 02:39:20

请注意,后台页面和弹出窗口处于同一进程(扩展进程)中,因此一个页面可以获取另一个页面的DOM窗口,然后直接调用函数或设置变量。例如,弹出窗口可以调用chrome.extension.getBackgroundPage来修改背景:

代码语言:javascript
复制
chrome.extension.getBackgroundPage().variable = 42;

后台页面可以调用chrome.extension.getViews来获取弹出式窗口:

代码语言:javascript
复制
var popups = chrome.extension.getViews({type: "popup"});
if (0 < popups.length)
  popups[0].variable = 42;

另一种设置共享变量的方法是使用传统的DOM,因为每个扩展都有一个假的来源(比如"eakjnniffhfegdpfehmnpcmjiameincp")。因此,当您在后台修改localStorage、document.cookie或IndexedDB时,它可以在弹出窗口中回读。

也就是说,即使在扩展过程中的页面中,您也可能仍然希望使用消息传递API,因为它可以使您的代码更加统一。消息传递是与内容脚本通信的唯一方式。

票数 30
EN

Stack Overflow用户

发布于 2012-03-03 01:28:40

使用chrome.extension API。

您可以来回发送请求,甚至更好地使用端口进行连续通信。

我给出的例子将创建弹出窗口和后台页面之间的双向通信,当打开弹出窗口时,这两个页面将连接起来。

只需创建一个同时包含在背景页和弹出页中的socket.js文件即可。然后,您只需在每一个上声明:

代码语言:javascript
复制
new Socket();

下面是socket.js的实现:

代码语言:javascript
复制
var Socket = function() {
    window.socket = this;

    this.port = chrome.extension.connect({name:"popupToBackground"});

    chrome.extension.onConnect.addListener(function(port) {
        if(port.name == "backgroundToPopup") {}
            else if(port.name == "popupToBackground") {
            window.socket.port = chrome.extension.connect({name:"backgroundToPopup"});
        }
        else {
            return;
        }

        port.onMessage.addListener(function(msg) {
            try {
                window[msg.namespace][msg.literal][msg.method].apply(this, msg.args);
            }
            catch(error) {
                // your failed action goes here.
            }
        });
    });
};

确保消息侦听器中的泛型方法调用为您所用。我喜欢我上面给出的格式--它非常健壮。要来回发送消息,只需将它们发送到套接字:

代码语言:javascript
复制
socket.post({ namespace: "myNamespace",
              literal: "myLiteral",
              method: "myMethod",
              args: ["argOne", "argTwo"]
           });
});

因此,如果这是从弹出页面执行的,则后台页面将调用:

代码语言:javascript
复制
window.myNamespace.myLiteral.myMethod(argOne, argTwo);

对我来说,这是一个非常好的可重用的javascript对象。如果你愿意,你甚至可以添加特定的原型函数-这样更容易发送消息:

代码语言:javascript
复制
Socket.prototype = {
    sendOneTwo: function() {
        socket.post({ namespace: "myNamespace",
                      literal: "myLiteral",
                      method: "myMethod",
                      args: ["argOne", "argTwo"]
    });
};

现在你要说的就是:

代码语言:javascript
复制
socket.sendOneTwo();
票数 9
EN

Stack Overflow用户

发布于 2015-01-30 08:24:28

仅出于调试目的,我发现这在popup JS中非常方便:

代码语言:javascript
复制
console = chrome.extension.getBackgroundPage().console
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9537435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档