我正在开发简单的FF SDK附加组件,我目前的目标是将网页中的附加链接传递给附加组件的代码并打开附加组件的标签。
手动https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/using_port告诉我使用self.port.emit()& self.port.on()是一种适当的方法。 self.port.emit()在我的内容脚本中调用,由PageMod嵌入到网页中但在main.js中我偶然发现了" self.port未定义"在cfx run运行的窗口中。以下是剪辑:
var pageMod = require("sdk/page-mod");
var self = require("sdk/self");
pageMod.PageMod({
include: "*", // <- this tell firefox to attach the following
// content script to all web pages
contentScriptFile: self.data.url("js/script.js")
});
self.port.on("gotLink", function(myAddonMessagePayload) {
var tabs = require("sdk/tabs");
tabs.open({
url: self.data.url("page.html"),
});
});
可能self.port不是那种来自var self = require的自我(&#34; sdk / self&#34;)?那么,我怎样才能做到正确的自我&#39;听取内容脚本中的数据?
答案 0 :(得分:0)
self.port.on
在内容脚本中工作,因为您需要一个工作对象(请参阅using port和worker object)来向内容脚本发送消息。所以在main.js中:worker.port.on
和worker.port.emit
以及内容脚本self.port.on
和self.port.emit
。
答案 1 :(得分:0)
第一,你是对的:&#34; self.port不是那种来自var self = require(&#34; sdk / self&#34;)&#34;的自我。请参阅:https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/self。
请注意,self模块与内容脚本可访问的全局自身对象完全不同,内容脚本使用内容脚本与附加代码进行通信。
第2,&#34;插件脚本&#34;可以与&#34;内容脚本&#34;像这样:
var worker = require("sdk/tabs").activeTab.attach({
contentScript: "self.port.emit('onTextSelected', window.getSelection().toString());"
});
worker.port.on("onTextSelected", function (text){
console.log("onTextSelected: "+ text);
selectionText = text;
});
您可以在&#34; PageMode&#34;。
中执行相同的操作