2016-01-17 32 views
1

在我的firefox sdk插件中,我想从我的数据目录中使用自定义网页作为我的设置/关于页面。如何在特定的选项卡上保留选项卡?

但是我在标签上留下了一些麻烦!

所以我有一个按钮,调用OptionsPanel()函数来打开我的网页在一个新标签。现在,我希望如果用户忘记了该选项卡,并且再次按下该按钮,它会激活已打开的设置选项卡。这意味着我需要知道该选项卡已打开,并且如果它处于打开状态,则需要能够切换到该选项卡,如果尚未打开,请将其打开。

这是我到目前为止,但它不工作;它只是总是打开一个新标签。我甚至不知道我是否在咆哮着正确的树。

const tabs = require("sdk/tabs"); 
var optionsTab; 
function OptionsPanel(){ 
    var opsTab = GetTabByID(optionsTab.id); 
    if(opsTab == null){ 
     tabs.open(data.url("OptionsPanel.html")); 
     optionsTab.id = tabs.tab.id; <======errors out as undefined 
    }else{ 
     opsTab.activate(); 
    } 
} 

//return a handle to the tab that matches specified tab id 
function GetTabByID(whatid){ 
    for(let thistab of tabs){ 
     if(thistab.id = whatid){ 
      return thistab; 
     } 
    } 
    return null; 
} 

所以,这里是我的目标:

  1. 打开我的页面在一个新的标签,如果它是尚未打开。
  2. 如果该选项卡已经打开,然后切换到该选项卡。
  3. 如果页面在浏览器加载时打开,则如果用户按下选项按钮,则准备切换到该选项卡。

回答

2

为什么你会认为tabs模块有tab属性?

通常情况下,您会使用activeTab属性。但是在调用tabs.open之后它不会立即更新。人们必须改用tabs[tabs.length - 1]

const tabs = require("sdk/tabs"); 
var optionsTabId; 
function OptionsPanel(){ 
    var opsTab = GetTabByID(optionsTabId); 
    if (opsTab == null) { 
     tabs.open(data.url("OptionsPanel.html")); 
     optionsTabId = tabs[tabs.length - 1].id; 
    } else { 
     opsTab.activate(); 
    } 
} 

此外,您在GetTabByID中犯了一个错误。

//return a handle to the tab that matches specified tab id 
function GetTabByID(whatid){ 
    for(let thistab of tabs){ 
     if(thistab.id == whatid){ // use == to compare 
      return thistab; 
     } 
    } 
    return null; 
} 

请记住,这是假设无法从选项选项卡中导航。以防万一,我会检查optsTab.url


另外,您可以利用标签事件接口

const tabs = require("sdk/tabs"); 
const OPTIONS_URL = data.url("OptionsPanel.html"); 
var optionsTab = null; 

function OptionsPanel(){ 
    if (optionsTab == null) { 
     tabs.open(OPTIONS_URL); 
     tabs.once('ready', function(tab) { 
      optionsTab = tab; 
      optionsTab.on('ready', function readyListener(tab) { 
       if (tab.url !== OPTIONS_URL) { 
        optionsTab.off('ready', readyListener); 
        optionsTab = null; 
       } 
      }) 
      optionsTab.once('close', function(tab) { 
       optionsTab = null; 
      }) 
     }); 
    } else { 
     optionsTab.activate(); 
    } 
} 
+0

选项卡模块的可能性“选项卡实例代表一个打开的选项卡。”正如我在标签实用工具文档中所看到的:https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/tabs#Tab,但我觉得这有点令人困惑,并且没有足够的例子为了我。 – bgmCoder

+0

感谢您的时间,minj;并指出'=='。我习惯于在Autohotkey中编码。 – bgmCoder

相关问题