Chrome扩展程序:如何记住之前的标签?

时间:2013-07-25 13:37:26

标签: google-chrome google-chrome-extension

我制作了一个扩展程序,可以记住上一个选项卡,然后单击按钮,可以在当前选项卡和上一个选项卡之间切换。现在我想扩展它以记住上一个上一个选项卡。这将允许在当前标签关闭后在两个标签之间切换。但是,我正在努力解决代码逻辑问题。要在当前和上一个标签之间切换的代码:

var previousTab;
var currentTab;

// Switch tab on button click
chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.update(previousTab, {selected: true});
});

// Update variables on tab change
chrome.tabs.onSelectionChanged.addListener(function(tab) {
    if (previousTab == null) {
        previousTab = tab;
    }
    if (currentTab == null) {
        currentTab = tab;
    }
    else {
        previousTab = currentTab;
        currentTab = tab;
    }
});

现在,关闭当前标签后,在两个标签之间切换的代码:

var previousTab;
var previousPreviousTab;
var currentTab;

// Switch tab on button click
chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.update(previousTab, {selected: true});
});

// Update variables on tab change
chrome.tabs.onSelectionChanged.addListener(function(tab) {
    if (previousTab == null) {
        previousTab = tab;
    }
    if (currentTab == null) {
        currentTab = tab;
    }
    if (previousPreviousTab == null) {
        previousPreviousTab = tab;
    }
    else {
        previousPreviousTab = previousTab;
        previousTab = currentTab;
        currentTab = tab;
    }
});

// Update variables on tab removal
chrome.tabs.onRemoved.addListener(function(tab) {
    previousTab = previousPreviousTab;
});

关于我的逻辑的一些事情一定是错的。当我打开两个新标签然后关闭最新标签时,点击切换按钮会引发错误tabs.update: No tab with id: 698.

2 个答案:

答案 0 :(得分:1)

这是一个想法: 创建一个标签对象数组(您可以通过调用chrome.windows.getAll()来获取所有标签对象。将一个属性添加到名为“recent_use”的每个标签对象中。将当前选定的标签设置为“0”。

任何时候,选择一个标签,将其“recent_use”设置为0.将“1”添加到所有其他标签的“recent_use”。通过这种方式,随着时间的推移,您将获得最近关注哪个选项卡的好订单。

然后,根据用户点击的击键次数(您必须在此处定义自己的击键),将选项卡焦点更改为“recent_use”等于用户点击击键次数的选项卡。这样,该解决方案比以前和之前的选项卡更通用。

(顺便说一句,你必须在创建或关闭新标签时随时修改这个标签数组。但是你可以通过为这些事件添加回调来轻松实现这一点)

在某种程度上,这是LFU的实现 - http://en.wikipedia.org/wiki/Least_frequently_used

答案 1 :(得分:0)

虽然我喜欢Methos的通用方法,但我只需要能够在两个标签之间切换。我最终使用另一个布尔wasRemoved和一个监听器onCreated来解决它:

var previousPreviousTab;
var wasRemoved;
var previousTab;
var currentTab;

// Update variables on tab creation
chrome.tabs.onCreated.addListener(function(tabId, changeInfo, tab) {
    previousPreviousTab = previousTab;
});

// Update variables on tab removal
chrome.tabs.onRemoved.addListener(function(tabId, changeInfo, tab) {
    previousTab = previousPreviousTab;
    wasRemoved = true;
});

// Update variables on tab change
chrome.tabs.onSelectionChanged.addListener(function(tab) {
    if (previousTab == null) {
        previousTab = tab;
    }
    if (currentTab == null) {
        currentTab = tab;
    }
    else if (wasRemoved == true) {
        currentTab = tab;
        wasRemoved = false;
    }
    else {
        previousTab = currentTab;
        currentTab = tab;
    }
});