【问题标题】:How to call a content script function from main.js in firefox addon如何在 firefox 插件中从 main.js 调用内容脚本函数
【发布时间】:2012-10-04 04:59:30
【问题描述】:

我是 Firefox 插件开发的新手。

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

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

我想从我的 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 中实现。

请帮帮我,我卡住了。

【问题讨论】:

    标签: javascript firefox-addon firefox-addon-sdk


    【解决方案1】:

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

    var worker = tabs.activeTab.attach({
      ...
    });
    
    // Some time later
    worker.postMessage("doABC");
    

    在内容脚本中:

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

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

    【讨论】:

    • 这是关于 SO 的一个非常常见的问题 - 我们应该开始链接到规范答案而不是重新回答吗?
    • @canuckistani:有规范的答案吗?我在这里的回答只是一个扩展的 RTFM。然而,大多数情况下,人们无法完全理解 SDK 的消息传递方法。我完全愿意将这些问题作为重复问题来结束,但从来没有一个问题足够相似(实际上可能表明“过于本地化”)。
    • 我回顾了这些问题的近期历史并同意 - 一切都足够不同。感谢您耐心地为他们指明正确的方向。
    【解决方案2】:

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

    但是我有类似的问题Accessing pre-loaded content script from ActionButton 尚未解决。

    // 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;   
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多