我使用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' });
答案 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;
});
}
});
答案 1 :(得分:0)
选项更新不会传播给已加载的工作人员。您必须使用port API中的消息传递来与内容脚本进行通信。