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

代码 injscr.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

您似乎已经从内容到 chrome 的通信正常工作了,为什么不在相反的方向使用相同的方法呢?这意味着injscr.js您将注册一个事件处理程序:

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

在您的 chrome 代码中,您将生成一个事件:

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

这会将事件分派给window当前选项卡的对象,但您也可以浏览所有选项卡并将事件分派给所有选项卡(取决于您要执行的操作)。

于 2012-11-13T07:07:50.980 回答