我想使用他們的sdk做一個Firefox插件,但我不知道如何讓我的js腳本進行通信。我們的目標是製作一個女巫形式的面板,其中有3個複選框,選中時可以隱藏/顯示活動選項卡上的某些元素。火狐插件腳本之間的通信sdk - self.port不存在
下面是腳本: main.js:
var data = require("sdk/self").data;
var painel1 = require("sdk/panel").Panel({
width: 215,
height: 160,
contentURL: data.url("painelDestroyer.html"),
contentScriptFile: [data.url("jquery.js"),data.url("panel.js")]
});
require("sdk/widget").Widget({
id: "open-form-btn",
label: "Clear",
contentURL: data.url("mozico.png"),
panel: painel1
});
// Attach a content script to the current active tab
let worker = require("sdk/tabs").activeTab.attach({
contentScriptFile: data.url("clear.js")
});
painel1.port.on("show-tag",function(tag){
worker.port.emit("show-tag", {tag:tag});
console.log("worker emited");
});
painel1.port.on("hide-tag",function(tag){
worker.port.emit("clear-tag", {tag:tag});
console.log("worker emited");
});
painel.js:
$("#imgD").click(function() {
if ($(this).is(":checked")) {
panel.port.emit("clear-tag","img");
console.log("panel emited");
} else {
panel.port.emit("show-tag","img");
console.log("panel emited");
}
});
$("#aD").click(function() {
if ($(this).is(":checked")) {
panel.port.emit("clear-tag","a");
console.log("panel emited");
} else {
panel.port.emit("show-tag","a");
console.log("panel emited");
}
});
$("#iframeD").click(function() {
if ($(this).is(":checked")) {
panel.port.emit("clear-tag","iframe");
console.log("panel emited");
} else {
panel.port.emit("show-tag","iframe");
console.log("panel emited");
}
});
clear.js:
function tagHide (tag, hide) {
$(tag).each(function() {
if (hide === false) {
$(this).css({
"visibility": "visible"
});
} else {
$(this).css({
"visibility": "hidden"
});
}
});
}
self.port.on('show-tag', function(tag) {
tagHide(tag, false);
});
self.port.on('clear-tag', function(tag) {
tagHide(tag, true);
});
問題:如何讓我這個工作,如何溝通這3個腳本?我的猜測是,我必須從painel.js發送消息到main.js,然後發送到clean.js,但我該怎麼做?如何在clean.js或painel.js中收到消息? 我不斷收到painel.js中不存在的self.port。
但是我該如何在「show-tag」和「hide-tag」之間切換,因爲它是由面板中的js定義的? 我需要將pannel.js文件中的port.emiter添加到附加腳本,然後添加到內容腳本中嗎?如從面板發送「1」或「2」到附加腳本,然後將其重新發送到內容腳本以對頁面執行操作?因爲我需要使用面板腳本來決定它是「1」還是「2」(在本例中爲「顯示」或「隱藏」)。 –
是的,您需要讓您的附加腳本將該命令從面板的內容腳本「轉發」到該選項卡的內容腳本。例如,在[Annotator教程](https://addons.mozilla.org/en-US/developers/docs/sdk/1.14/dev-guide/tutorials/annotator/overview.html)中,「左鍵單擊」從小部件內容腳本通過'main.js'轉發到'page-mod'內容腳本上的'activate/deactivate'消息。 –
@GiovanniDiToro我更新了我的答案。 –