Javascript 如何在firefox插件中从main.js调用内容脚本函数

Javascript 如何在firefox插件中从main.js调用内容脚本函数,javascript,firefox-addon,firefox-addon-sdk,Javascript,Firefox Addon,Firefox Addon Sdk,我是Firefox插件开发新手 我需要一种从firefox插件中的main.js调用contentscript函数的方法 我在每个打开的网页上都注入了contentscript xyz.js 单击导航工具栏中的按钮,我想从my main.js调用contentscript xyz.js中的函数abc() 下面是我的代码 Main.js .. function addToolbarButton() { var document = mediator.getMostRecentWindow(

我是Firefox插件开发新手

我需要一种从firefox插件中的main.js调用contentscript函数的方法

我在每个打开的网页上都注入了contentscript xyz.js

单击导航工具栏中的按钮,我想从my main.js调用contentscript xyz.js中的函数abc()

下面是我的代码

Main.js

..
function addToolbarButton() {
    var document = mediator.getMostRecentWindow('navigator:browser').document;        
    var navBar = document.getElementById('nav-bar');
    if (!navBar) {
        return;
    }
    var btn = document.createElement('toolbarbutton');  
    btn.setAttribute('id', 'mybutton-id');
    btn.setAttribute('type', 'button');
    btn.setAttribute('class', 'toolbarbutton-1');
    btn.setAttribute('image', data.url('icon_16.png'));
    btn.setAttribute('orient', 'vertical');
        btn.setAttribute('label', 'Test');
        btn.addEventListener('click', function() {
            tabs.activeTab.attach({
            //

                abc()     //here i want to call the function present in my contentscript 

            //
        });
        }, false)
    navBar.appendChild(btn);
}

..
xyz.js

..

function abc(){
//here is my code logic
}

..
我开始知道消息传递是一种方法,但无法在firefox中实现


请帮助我,我遇到了问题。

您不能直接调用函数,您需要向内容脚本发送消息。意思是这样的:

var worker = tabs.activeTab.attach({
  ...
});

// Some time later
worker.postMessage("doABC");
在内容脚本中:

self.on("message", function(message) {
  if (message == "doABC")
    abc();
});

有关与内容脚本通信的更多信息,请参阅。

根据文档,它应该以这种方式工作

然而,我有一个类似的问题尚未解决

// main.js
function handleClick(state) {
    var myWorker = tabs.activeTab.attach({

    });   
    myWorker.port.emit("initialize", "Message from the add-on");
}

// content.js
/*BEGIN Listen events coming from Add-on script*/
self.port.on("initialize", function () {
    alert('self.port.on("initialize")');
    return;   
});

这是一个非常常见的问题——我们应该开始链接到一个规范答案而不是重新回答吗?@canuckistani:有一个规范答案吗?我的答案是一个扩展的RTFM。然而,在大多数情况下,人们无法完全理解SDK的消息传递方法。我完全支持将这些问题作为重复问题来结束,但从来没有一个问题足够相似(实际上可能是“太本地化”的迹象)。我回顾了这些问题的最新历史,并同意——所有问题都已经足够不同了。感谢你有耐心为他们指出正确的方向。