0

我做了一个扩展,它可以记住上一个选项卡,并在当前选项卡和上一个选项卡之间切换按钮单击。现在我想扩展它以记住上一个选项卡。一旦关闭当前选项卡,这将允许在两个选项卡之间切换。但是,我在代码逻辑上苦苦挣扎。在当前选项卡和上一个选项卡之间切换的代码:

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.

4

2 回答 2

1

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

任何时候,选择一个选项卡,将其“recent_use”设置为 0。将“1”添加到所有其他选项卡的“recent_use”。这样,随着时间的推移,您将获得最近关注的选项卡的良好顺序。

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

(顺便说一句,您还必须在创建或关闭新选项卡时修改此选项卡数组。但您可以通过为这些事件添加回调轻松地做到这一点)

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

于 2013-07-25T17:44:06.047 回答
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;
    }
});
于 2013-08-01T15:37:48.557 回答