1

Firefox 用の拡張機能があり、ページに挿入された JS コードを作成します。

XUL のコード:

window.addEventListener("load", function load(event){
document.addEventListener("TestEvnt", function (e) {
    var info = e.detail;
    if(info.cmd=='account_list') {
        consoleLog('... event account_list');
    }
}, false, true);
document.addEventListener("DOMContentLoaded", function (e) {
  var window = e.originalTarget.defaultView.wrappedJSObject;
  var inject = window.document.createElement('script');
  inject.type = 'text/javascript';
  inject.setAttribute('src','resource://apptab-notify/injscr.js');
  window.document.getElementsByTagName('head')[0].appendChild(inject);
}, false);
},false);

jscr.js のコード:

var additionalInfo = {
        "cmd": 'account_list',
        "url": document.location.href
    };
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('TestEvnt', true, false, additionalInfo);
document.dispatchEvent(evt);

拡張機能からのコード インジェクション イベントをリッスンする双方向通信を提供するにはどうすればよいですか? Addon-SDKを使わずに!

4

2 に答える 2

1

injsrc.js で:

var additionalInfo = {
    "cmd": 'account_list',
    "url": document.location.href
};

var request = document.createTextNode(JSON.stringify(additionalInfo));
request.addEventListener("something-response", function(event) {
    console.log('... something-response');
    var info=JSON.parse(event.target.nodeValue);
    $('body').css('background-color', info.color);
}, false);
document.head.appendChild(request);
var event = document.createEvent("HTMLEvents");
event.initEvent("something-query", true, false);
request.dispatchEvent(event);

XUL では:

window.addEventListener('load', function(event) {
   document.addEventListener("something-query", function(event) {
        consoleLog('... something-query');
        var node = event.target;
        if (!node || node.nodeType != Node.TEXT_NODE) return;
        var info = JSON.parse(node.nodeValue);
        var doc = node.ownerDocument;

        if (info.cmd == 'account_list') {
            consoleLog('... event account_list');
            var event = doc.createEvent("HTMLEvents");
            event.initEvent("something-response", true, false);
            node.nodeValue = JSON.stringify({
                'color': '#999'
            });
            node.dispatchEvent(event);
        } else if (info.cmd == 'page_options') {
            consoleLog('page_options');
        }
    }, false, true);
}, false);

記事がMDNに役立ちました

于 2012-11-15T11:54:02.477 に答える
0

コンテンツからクロムへの通信はすでに正しく機能しているようですが、同じアプローチを逆方向にも使用してみませんか? つまりinjscr.js、イベント ハンドラーを登録します。

window.addEventListener("TestEvnt2", function(event)
{
  var info = event.detail;
  ...
}, false);

そして、クロムコードでイベントを生成します:

var event = document.createEvent("CustomEvent");
event.initCustomEvent("TextEvnt2", false, false, additionalInfo);
gBrowser.contentWindow.dispatchEvent(event);

これwindowにより、現在のタブのオブジェクトにイベントがディスパッチされますが、すべてのタブを調べて、すべてのタブにイベントをディスパッチすることもできます (何をしようとしているかによって異なります)。

于 2012-11-13T07:07:50.980 に答える