Firefox addon 在firefox插件中检测TabMove

Firefox addon 在firefox插件中检测TabMove,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,试验了impl。中给出:添加或删除选项卡时 用于跟踪“tabmove”。没用 如果您能在这方面提供帮助,我们将不胜感激 顺便说一句,已经尝试了下面的代码。只接收到“TabOpen”事件。”“TabClose”和“TabMove”不起作用: var browserWindows = require("sdk/windows").browserWindows; var activeWindow = browserWindows ? browserWindows.activeWindow : {}

试验了impl。中给出:添加或删除选项卡时

用于跟踪“tabmove”。没用

如果您能在这方面提供帮助,我们将不胜感激

顺便说一句,已经尝试了下面的代码。只接收到“TabOpen”事件。”“TabClose”和“TabMove”不起作用:

var browserWindows = require("sdk/windows").browserWindows;
var activeWindow = browserWindows ? browserWindows.activeWindow : {};
var browserWindow = activeWindow ? require("sdk/view/core").viewFor(activeWindow) : {};
var DOMWindow = browserWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);

var exampleTabAdded = function(event) {
	var browser = DOMWindow.gBrowser.getBrowserForTab(event.target);
	console.log('tab added: '+ event.target);
};
var exampleTabMoved = function(event) {
	var browser = DOMWindow.gBrowser.getBrowserForTab(event.target);
	console.log('tab moved: '+ event.target);
};

function exampleTabRemoved(event) {
  var browser = gBrowser.getBrowserForTab(event.target);
  console.log('tab removed: '+ event.target);
}


function exampleTabSelected(event) {
  var browser = gBrowser.getBrowserForTab(event.target);
  console.log('tab selected: '+ event.target);
}

var container = DOMWindow.gBrowser.tabContainer;
container.addEventListener("TabMove", exampleTabMoved, false);
container.addEventListener("TabOpen", exampleTabAdded, false);
container.addEventListener("TabClose", exampleTabRemoved, false);
container.addEventListener("TabSelect", exampleTabSelected, false);

这似乎奏效了。使用sdk api和XUL内容文档。 如果有更好的方法处理“tabmove”,请发布答案

var tabs=require(“sdk/tabs”);
var{modelFor}=require(“sdk/model/core”);
var{viewFor}=require(“sdk/view/core”);
var tab_utils=require(“sdk/tabs/utils”);
var contentDocumentMap=新映射();
函数映射HighLevelTabToLowLevelContentDocument(选项卡){
var lowLevelTab=viewFor(选项卡);
var browser=tab_utils.getBrowserForTab(低层选项卡);
返回browser.contentDocument;
}
功能打开(选项卡){
选项卡打开(“页面显示”,日志显示);
选项卡打开(“激活”,logActivate);
选项卡打开(“停用”,logDeactivate);
选项卡打开(“关闭”,logClose);
}
功能日志显示(选项卡){
var contentWindow=mapHighLevelTabToLowLevelContentDocument(选项卡);
if((contentWindow.URL=='about:newtab')| |(contentWindow.URL=='about:blank')){
返回;
}
if(contentDocumentMap.has(contentWindow)){
返回;
}
contentDocumentMap.set(contentWindow,tab.id.toString());
}
功能日志激活(选项卡){
var contentWindow=mapHighLevelTabToLowLevelContentDocument(选项卡);
if((contentWindow.URL=='about:newtab')| |(contentWindow.URL=='about:blank')){
返回;
}
if(contentDocumentMap.has(contentWindow)){
返回;
}
contentDocumentMap.set(contentWindow,tab.id.toString());
}
功能日志停用(选项卡){
setTimeout(函数(){
var windows=require(“sdk/windows”).browserWindows;
对于(让窗口中的窗口){
var activeTabContentWindow=mapHighLevelTabToLowLevelContentDocument(window.tabs.activeTab);
var activeTabId=window.tabs.activeTab.id.toString();
if((contentDocumentMap.has(activeTabContentWindow))&&(contentDocumentMap.get(activeTabContentWindow)!==activeTabId)){
log('moved.url:'+window.tabs.activeTab.url);
log('from tabid:'+contentDocumentMap.get(activeTabContentWindow)+'到tabid:'+activeTabId);
contentDocumentMap.delete(activeTabContentWindow);
contentDocumentMap.set(activeTabContentWindow,activeTabId);
}
}
}, 150);
}
功能日志关闭(选项卡){
var targetTabId=tab.id.toString();
setTimeout(函数(){
var windows=require(“sdk/windows”).browserWindows;
对于(让窗口中的窗口){
var activeTabContentWindow=mapHighLevelTabToLowLevelContentDocument(window.tabs.activeTab);
var activeTabId=window.tabs.activeTab.id.toString();
if(contentDocumentMap.has(activeTabContentWindow)){
if(contentDocumentMap.get(activeTabContentWindow)!==activeTabId){
log('moved.url:'+window.tabs.activeTab.url);
log('from tabid:'+contentDocumentMap.get(activeTabContentWindow)+'到tabid:'+activeTabId);
contentDocumentMap.delete(activeTabContentWindow);
contentDocumentMap.set(activeTabContentWindow,activeTabId);
}
else if(targetTabId==activeTabId){
contentDocumentMap.delete(activeTabContentWindow);
}
}
}
}, 150);
}

制表符on(打开),onOpen(打开)这是一个xul事件,如果不点击xul,它将无法从sdk工作。让我检查一下sdk是否有等效的事件。编辑:似乎没有,让我们拭目以待,看看sdk专家是否对此有任何意见,否则我将向您展示如何进入xulThanks以获得快速响应。我不介意在附加组件中使用xul。那里的工作太棒了!不使用XUL的非常有趣的方法。