【问题标题】:Add-on Builder: Multiple Workers Using port?附加构建器:使用端口的多个工人?
【发布时间】:2012-03-19 06:00:57
【问题描述】:

参考这个问题:Add-on Builder: ContentScript and back to Addon code?

这是我的插件代码:

var widget = widgets.Widget({
  id: "addon",
  contentURL: data.url("icon.png"),
  onClick: function() {
    var workers = [];
    for each (var tab in windows.activeWindow.tabs) {
        var worker = tab.attach({contentScriptFile: [data.url("jquery.js"), data.url("myScript.js")]});
        workers.push(worker);
    }
  }
});

这里是 myScript.js:

var first = $(".avatar:first");
if (first.length !== 0) {
    var url = first.attr("href");
    self.port.emit('got-url', {url: url});
}

现在我有多个工人,我应该把它放在哪里

worker.port.on('got-url', function(data) {
            worker.tab.url = data.url;
        });

因为在另一个问题中我只有一个工人,但现在我有一组工人。

【问题讨论】:

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


    【解决方案1】:

    代码是:

    // main.js:
    var data = require("self").data;
    var windows = require("windows").browserWindows;
    
    var widget = require("widget").Widget({
        id: "addon",
        label: "Some label",
        contentURL: data.url("favicon.png"),
        onClick: function() {
            //var workers = [];
            for each (var tab in windows.activeWindow.tabs) {
    
                var worker = tab.attach({
                    contentScriptFile: [data.url("jquery.js"), 
                    data.url("inject.js")]
                });
    
                worker.port.on('got-url', function(data) {
                    console.log(data.url);
                    // worker.tab.url = data.url;
                });
    
                worker.port.emit('init', true);
                console.log("got here");
                //workers.push(worker);
            }
        }
    });
    
    // inject.js
    $(function() {
        self.port.on('init', function() {
            console.log('in init');
            var first = $(".avatar:first");
            if (first.length !== 0) {
                var url = first.attr("href");
                console.log('injected!');
                self.port.emit('got-url', {url: url});
            }    
        });
    });
    

    编辑:抱歉,应该实际运行代码,我们有一个时间问题,内容脚本是在设置工作侦听器之前注入的,所以当'got-url' 事件已发出。我通过将内容脚本中的任何操作推迟到内容脚本中发出“init”事件来解决此问题。

    这是一个关于构建器的工作示例:

    https://builder.addons.mozilla.org/addon/1045470/latest/

    这个例子剩下的问题是没有办法判断一个标签是否被我们的插件注入,所以每次点击小部件时我们都会“泄漏”或使用更多的内存。更好的方法可能是在加载时使用 page-mod 注入内容脚本,并且仅在小部件的 onclick 处理程序中发出“init”事件。

    【讨论】:

    • 我试过这个,但由于某种原因 got-url 函数只触发一次。它应该为每个工人做一次......
    • 我突然想到这可能是同步问题吗?
    • 内存泄漏究竟发生在哪里?
    • 正在发生的“泄漏”是每次单击小部件时,都会在窗口中的每个选项卡中注入一个新的工作人员。最好在标签页打开的时候处理内容脚本注入,所以你只做一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2018-07-27
    • 2015-02-10
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多