2015-10-08 17 views
0

試驗了impl。在以下位置給出:https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Tabbed_browser#Notification當添加或刪除標籤時檢測Firefox中的TabMove插件

用於跟蹤'tabmove'。沒有工作。

希望在這方面的幫助。

順便說一句,已經嘗試過下面的代碼。只收到'TabOpen'事件。 'TabClos​​e' 和 '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) { 
 
\t var browser = DOMWindow.gBrowser.getBrowserForTab(event.target); 
 
\t console.log('tab added: '+ event.target); 
 
}; 
 
var exampleTabMoved = function(event) { 
 
\t var browser = DOMWindow.gBrowser.getBrowserForTab(event.target); 
 
\t 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);

感謝

+0

這是一個XUL事件,也不會從SDK沒有竊聽到XUL工作。讓我檢查一下sdk是否有相同的事件。編輯:似乎沒有一個,讓我們拭目以待,看看sdk專家是否有任何輸入,否則虐待你告訴你如何挖掘xul – Noitidart

+0

感謝您的快速反應。我不介意在附加組件中使用xul。 – Nandu

回答

0

這似乎是工作。使用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 = new Map(); 
 

 
function mapHighLevelTabToLowLevelContentDocument(tab) { 
 
\t var lowLevelTab = viewFor(tab); 
 
\t var browser = tab_utils.getBrowserForTab(lowLevelTab); 
 
\t return browser.contentDocument; 
 
} 
 

 
function onOpen(tab) { 
 
\t tab.on("pageshow", logShow); 
 
\t tab.on("activate", logActivate); 
 
\t tab.on("deactivate", logDeactivate); 
 
\t tab.on("close", logClose); 
 
} 
 

 
function logShow(tab) { 
 
\t var contentWindow = mapHighLevelTabToLowLevelContentDocument(tab); 
 
\t if ((contentWindow.URL === 'about:newtab') || (contentWindow.URL === 'about:blank')) { 
 
\t \t return; 
 
\t } 
 
\t if (contentDocumentMap.has(contentWindow)) { 
 
\t \t return; 
 
\t } 
 
\t contentDocumentMap.set(contentWindow, tab.id.toString()); 
 
} 
 

 
function logActivate(tab) { 
 
\t var contentWindow = mapHighLevelTabToLowLevelContentDocument(tab); 
 
\t if ((contentWindow.URL === 'about:newtab') || (contentWindow.URL === 'about:blank')) { 
 
\t \t return; 
 
\t } 
 

 
\t if (contentDocumentMap.has(contentWindow)) { 
 
\t \t return; 
 
\t } 
 
\t contentDocumentMap.set(contentWindow, tab.id.toString()); 
 
} 
 

 
function logDeactivate(tab) { 
 
\t setTimeout(function() { 
 
\t \t var windows = require("sdk/windows").browserWindows; 
 
\t \t for (let window of windows) { 
 
\t \t \t var activeTabContentWindow = mapHighLevelTabToLowLevelContentDocument(window.tabs.activeTab); 
 
\t \t \t var activeTabId = window.tabs.activeTab.id.toString(); 
 
\t \t \t if ((contentDocumentMap.has(activeTabContentWindow)) && (contentDocumentMap.get(activeTabContentWindow) !== activeTabId)) { 
 
\t \t \t \t console.log('M O V E D. url: '+ window.tabs.activeTab.url); 
 
\t \t \t \t console.log('from tabid: '+ contentDocumentMap.get(activeTabContentWindow) + ' to tabid: ' + activeTabId); 
 
\t \t \t \t contentDocumentMap.delete(activeTabContentWindow); 
 
\t \t \t \t contentDocumentMap.set(activeTabContentWindow, activeTabId); 
 
\t \t \t } 
 
\t \t } 
 
\t }, 150); 
 
} 
 

 

 

 
function logClose(tab) { 
 
\t var targetTabId = tab.id.toString(); 
 
\t setTimeout(function() { 
 
\t \t var windows = require("sdk/windows").browserWindows; 
 
\t \t for (let window of windows) { 
 
\t \t \t var activeTabContentWindow = mapHighLevelTabToLowLevelContentDocument(window.tabs.activeTab); 
 
\t \t \t var activeTabId = window.tabs.activeTab.id.toString(); 
 
\t \t \t if (contentDocumentMap.has(activeTabContentWindow)) { 
 
\t \t \t \t if (contentDocumentMap.get(activeTabContentWindow) !== activeTabId) { 
 
\t \t \t \t \t console.log('M O V E D. url: '+ window.tabs.activeTab.url); 
 
\t \t \t \t \t console.log('from tabid: '+ contentDocumentMap.get(activeTabContentWindow) + ' to tabid: ' + activeTabId); 
 
\t \t \t \t \t contentDocumentMap.delete(activeTabContentWindow); 
 
\t \t \t \t \t contentDocumentMap.set(activeTabContentWindow, activeTabId); 
 
\t \t \t \t } 
 
\t \t \t \t else if (targetTabId === activeTabId){ 
 
\t \t \t \t \t contentDocumentMap.delete(activeTabContentWindow); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t }, 150); 
 
} 
 

 
tabs.on('open', onOpen);

+0

真棒!非常有趣的方式來做到這一點,而不使用XUL。 – Noitidart