如何在特定标签上保留标签?

时间:2016-01-17 18:52:37

标签: firefox-addon-sdk

在我的firefox sdk插件中,我想使用我的数据目录中的自定义网页作为我的设置/关于页面。

但是我无法在标签上看到标签!

所以我有一个按钮,调用OptionsPanel()功能在新标签页中打开我的网页。现在,我希望如果用户忘记该选项卡已打开并再次按下该按钮,则会激活已打开的设置选项卡。这意味着我需要知道标签是打开的,我需要能够切换到它,如果它是OR打开它,如果它还没有打开。

这是我到目前为止所提出的,但它不起作用;它只是总是打开一个新标签。我甚至都不知道我是不是正在吠叫树。

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. 如果浏览器加载时页面已打开,则在用户按下选项按钮时准备切换到该选项卡。

1 个答案:

答案 0 :(得分: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();
    }
}