我正在使用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中的错误还是我只是做了一些非常错误的事情?谢谢!