2012-10-04 6 views
6

Firefoxのアドオン開発の初心者です。Firefoxのアドオンでmain.jsからコンテンツスクリプト関数を呼び出す方法

firefoxアドオンのmain.jsからcontentscript関数を呼び出す方法が必要です。

私はすべてのオープニングウェブページにcontentscript xyz.jsを注入しました。

ナビゲーションツールバーにあるボタンをクリックすると、私のcontentscript xyz.jsに存在する関数abc()がmain.jsから呼び出されます。

以下は私のコードです。私はそのメッセージパッシングを知るようになった

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で実装することができません。

私はstuckdを持っているのを助けてください。

答えて

4

機能を直接呼び出すことはできません。コンテンツスクリプトにメッセージを送信する必要があります。コンテンツスクリプトがdocumentationを参照してくださいとの通信の詳細については

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

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

// Some time later 
worker.postMessage("doABC"); 

とコンテンツスクリプト内:そのような何かを意味します。

+0

これは非常によくある質問です。再回答するのではなく、標準的な回答にリンクする必要がありますか? – canuckistani

+0

@canuckistani:正式な回答はありますか?私の答えはRTFMを拡張したものです。しかし、たいていの場合、SDKのメッセージングアプローチを心がけることができないのは、大抵の人です。私はこれらの質問を重複として終わらせることに全部なりますが、それと似た質問は決してありません。 –

+0

私はこれらの質問の最近の歴史を見直し、同意します。右の方向にそれらを指すために忍耐力を持っていただきありがとうございます。 – canuckistani

1

ドキュメントによると、このように動作するはずです。

しかし、私は同様の質問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; 
}); 
関連する問題