我正在使用Firefox Add-on SDK创建一个在用户选择页面上的文本时触发的附加组件 . 我使用高级模块 sdk/selection ,但我发现了一个问题 .

这是一个有效的测试示例,我的 main.js 完全定义如下:

var self = require("sdk/self");
var pageMod = require("sdk/page-mod");
var selection = require("sdk/selection");

var activeWorker = null;
var workerID = 0;

pageMod.PageMod({
    include: "*",
    contentScriptFile: self.data.url("some-empty-file.js"),
    onAttach: function(worker)
    {
        worker.id = workerID++;

        worker.onSelection = function() {
            console.log("selected text: " + selection.text + " (from worker " + worker.id + ")");
        }

        worker.activate = function() {
            if (activeWorker != null) {
                activeWorker.deactivate();
            }
            console.log("activate worker " + worker.id);
            selection.on('select', worker.onSelection);
            activeWorker = worker;
        }

        worker.deactivate = function() {
            console.log("deactivate worker " + worker.id);
            selection.removeListener('select', worker.onSelection);
            activeWorker = null;
        }

        worker.on('pageshow', function() {
            console.log("pageshow " + worker.tab.title);
            worker.activate();
        });
    }
});

从本质上讲,它会尝试在每次显示页面时将工作者附加到页面,方法是禁用活动工作程序(如果存在)然后设置新工作程序 . 正如您所看到的,每次我使用 selection.on('select', ...) 事件注册一名工作人员时,我都会对前一个活动工作人员进行相应的 selection.removeListener('select', ...) . 这应始终与 selection 模块保持一次注册:由活动工作者创建的模块 .

但现在请看以下 console.log s,以及相关步骤:

打开 mozilla.org 并等待页面加载 .

log: pageshow Home of the Mozilla Project — Mozilla
log: activate worker 0

在页面上选择一些文本(在这种情况下,“志愿者”) . 它工作正常 .

log: selected text: volunteers (from worker 0)

现在打开 mozilla.org/firefox (在同一页面上) .

log: pageshow Download Firefox — Free Web Browser — Mozilla
log: deactivate worker 0
log: activate worker 1

在页面上选择一些文本(在本例中为“Firefox”) . 它工作正常 .

log: selected text: Firefox (from worker 1)

现在按后退按钮转到最后一页 .

log: pageshow Home of the Mozilla Project — Mozilla
log: deactivate worker 1
log: activate worker 0

我们回到了Mozilla的主页 . 再次在页面上选择一些文本(在本例中为“支持者”) .

log: selected text: supporters (from worker 0)
log: selected text: supporters (from worker 0)

它会触发两次 .

我找不到代码的问题,只有在页面中返回或转发时才会出现问题 . 如果你继续打开页面并以某种方式前进和后退,它将开始触发两次以上 .

这可能是SDK中的错误还是我只是做了一些非常错误的事情?谢谢!