Firefox Addon SDK - pageMod更新contentScriptOptions?

时间:2015-03-20 17:42:00

标签: javascript firefox firefox-addon-sdk

我使用example.com中的以下代码向main.js上的网页添加内容脚本:

var self = require("sdk/self");
var pageMod = require("sdk/page-mod");

pageMod.PageMod({
        include: "https://example.com/*",
        contentScriptWhen: "ready",
        contentScriptFile: [
            self.data.url("example.js"),
        ],
        contentScriptOptions: {
            myString: 'helloWorld'
        }
    });

如果我设置了一个工作人员或事件监听器,告诉main.js更新myString的值(可以使用self.options.myString从内容脚本访问),我该怎样才能反映出下一个example.js页面加载的example.com内容脚本?

我尝试使用新的pageMod.PageMod值再次调用myString函数,但这会导致example.js在页面上运行两次。

修改

我已实施Port API,但现在我仍然坚持如何更新contentScriptOptions传递给内容脚本的对象。

/* main.js */
var self = require("sdk/self");
var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    include: "https://example.com/*",
    contentScriptWhen: "ready",
    contentScriptFile: [
        self.data.url("example.js"),
    ],
    contentScriptOptions: {
        myString: 'foo'
    },
    onAttach: function(worker) {
        worker.port.on("updateOptions", function(data) {

            // how to replace myString with value from data.myString?

        });
    }
});

/* example.js */
self.port.emit('updateOptions', { myString: 'bar' });

2 个答案:

答案 0 :(得分:1)

您需要Port API。

在您的内容脚本中,emit收听侦听PageMod的消息。

/* example.js */  
self.port.emit("nameForTheMessage", "bar"); // self is a global variable  

在PageMod中,调用内容脚本的函数onAttach

/* main.js */
var self = require("sdk/self");
var pageMod = require("sdk/page-mod");

var externalStringVar =  "helloWorld";

var pageMod = pageMod.PageMod({
    include: "https://example.com/*",
    contentScriptWhen: "ready",
    contentScriptFile: [self.data.url("example.js")],
    contentScriptOptions: {
        myString: externalStrVar; // Pass it to the content script
    }
    onAttach: function(worker) {
        worker.port.on("nameForTheMessage", function(updatedString) {
            // update string value when a message is received like so:
            externalStringVar = updatedString;
        });
    }
});

MDN docs

答案 1 :(得分:0)

选项更新不会传播给已加载的工作人员。您必须使用port API中的消息传递来与内容脚本进行通信。