Chr*_*mer 4 javascript firefox-addon-sdk
我一直在研究与页面模块进行通信的上下文菜单,并遇到问题.
只要我不刷新页面,我就可以通过右键单击发送到页面/选项卡的通信.刷新页面时,将创建一个新工作程序,并且上下文菜单无法与工作程序通信.
我现在有两个相同的工人,但就像旧工人已过期一样.这意味着onMessage中的这个循环:不起作用,因为它拾取了第一个worker.
for (index = 0; index < workers.length; index += 1) {
if (workers[index].tab.index === tabs.activeTab.index) {
workers[index].port.emit("rightClick", string, ss.storage.product);
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找删除旧工人刷新,但似乎没有选择这样做.我从根本上错过了一些关于工人处理的事情吗?
我收到的错误是:错误:页面当前是隐藏的,在再次可见之前无法再使用.
这与以下事实是一致的:就工人而言,我现在正在查看同一选项卡中的新页面.我认为worker.on('detach',function(){})应该处理这个问题但似乎这只是关闭选项卡.
任何意见,将不胜感激.
稍微休息后添加 OK我决定使用其他地方推荐的detachWorker功能进行分离.我把它放在我的pageMod对象的顶部,如下所示
// Clean up duplicate worker
for (index in workers) {
if(workers[index].url === worker.url && workers[index].tab.index === worker.tab.index) {
detachWorker(workers[index], workers);
}
}
Run Code Online (Sandbox Code Playgroud)
这解决了问题(暂时),虽然我不认为这是正确的方法.解决方案的任何进展:).
也进入这个.Worker对象似乎在过去的某些页面中保留(并且在历史记录中返回和转发时重复使用).解决方案是监听pagehide和pageshow事件,以便只保留当前显示的数组:
var pageMod = require("sdk/page-mod");
var array = require('sdk/util/array');
var pageWorkers = [];
pageMod.PageMod({
onAttach: function(worker) {
array.add(pageWorkers, worker);
worker.on('pageshow', function() { array.add(pageWorkers, this); });
worker.on('pagehide', function() { array.remove(pageWorkers, this); });
worker.on('detach', function() { array.remove(pageWorkers, this); });
// do other work.
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,array.add函数负责不添加重复项.