2013-07-25 2 views
0

Я сделал расширение, которое запоминает предыдущую вкладку и кнопку нажимает кнопки между текущей вкладкой и предыдущей вкладкой. Теперь я хочу расширить это, чтобы также помнить предыдущую предыдущую вкладку. Это позволит переключаться между двумя вкладками после закрытия вкладки . Однако я борюсь с логикой кода. Код для переключения между текущим и предыдущим вкладки:Расширение Chrome: как запомнить предыдущую предыдущую вкладку?

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.

ответ

1

Вот идея: Создание вкладок объектов массива (вы можете получить все объекты вкладки с помощью вызова хром. window.getAll(). Добавить свойство для каждого объекта табуляции, называемого «recent_use». Установите его на «0» для текущей вкладки.

В любое время выбирается вкладка, установите ее «recent_use» равным 0. Добавить «1» на все «недавние_закладки» другой вкладки. Таким образом, со временем вы получите отличный порядок, с которого была недавно сфокусирована вкладка.

Тогда в зависимости от того, сколько нажатий клавиш нажали (вы должны определить ne ваши собственные ключевые штрихи здесь), измените фокус вкладки на вкладку с «recent_use», равную количеству раз, когда пользователь нажал эту клавишу. Таким образом, решение является более общим, чем предыдущая и предыдущая предыдущая вкладка.

(Кстати, вы должны также позаботиться о модификации этой вкладки массива в любое время новая вкладка создается или закрыта. Но вы можете легко сделать это, добавив обратные вызовы для этих событий)

В некотором смысле, это реализация LFU - http://en.wikipedia.org/wiki/Least_frequently_used

+0

Спасибо. Хотя в будущем это может быть здорово переключиться между всеми вкладками, я хочу только переключиться между двумя вкладками на данный момент. – orschiro

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; 
    } 
}); 
Смежные вопросы