Лучший способ проверить, есть ли вкладка с точным идентификатором в Chrome
Иногда есть идентификатор закладки, хранящийся в переменной, и вам нужно проверить, существует ли табуляция, прежде чем что-то делать с ней (поскольку пользователи могут закрывать вкладки в любое время). Я нашел это решение:
chrome.tabs.get(1234567, function(tab) {
if (typeof tab == 'undefined') {
console.log('Tab does not exist!');
}
});
Это работает, но у него есть довольно серьезный недостаток. Он записывает сообщение об ошибке в консоль следующим образом:
Ошибка во время tabs.get: нет вкладки с идентификатором: 1234567.
И это не исключение. Так что try/catch не может помочь. Это просто сообщение в консоли.
Любые идеи?
UPDATE: эта ошибка теперь выглядит как "Unchecked runtime.lastError при запуске tabs.get: нет вкладки с идентификатором: 1234567."
Ответы
Ответ 1
function callback() {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message);
} else {
// Tab exists
}
}
chrome.tabs.get(1234,callback);
source Ошибка расширения Chrome: &" Unchecked runtime.lastError при запуске browserAction.setIcon: Нет вкладки с идентификатором "
Edit:
Chrome проверяет, было ли проверено значение chrome.runtime.lastError обратный вызов и выводит консольное сообщение для этой "необработанной асинхронной исключение". Если вы это сделаете, это не загрязнит консоль.
Из комментария @Xan
Ответ 2
Существует другое решение, основанное на комментарии Яна (спасибо @Ian) на вопрос.
function tabExists (tabId, onExists, onNotExists) {
chrome.windows.getAll({ populate: true }, function (windows) {
for (var i = 0, window; window = windows[i]; i++) {
for (var j = 0, tab; tab = window.tabs[j]; j++) {
if (tab.id == tabId) {
onExists && onExists(tab);
return;
}
}
}
onNotExists && onNotExists();
});
}
Он проверен и работает хорошо, поэтому каждый может его использовать. Если кто-то может найти более короткое решение, то с помощью chrome.windows.getAll
напишите!
ОБНОВЛЕНИЕ: Поскольку @anglinb ответит, мой ответ больше не действителен
Ответ 3
Я очень удивлен тем, что нет API для выполнения этой простой задачи. Помимо того, что предложил @КонстантинСмолянин, я придумал этот более простой метод:
function checkTabIDValid(nTabID, callbackDone)
{
chrome.browserAction.getBadgeText({tabId: nTabID}, function(dummy)
{
if(callbackDone)
callbackDone(!chrome.runtime.lastError);
});
}
К сожалению, он также должен сообщать результат асинхронно:
checkTabIDValid(tabId, function(res){
console.log("tab " + (res ? "exists" : "doesn't exist"));
});
Ответ 4
Действительно, в хром-интерфейсе нет функции "существует"...
Я написал этот код:
var tabID = 551;
chrome.tabs.query( {}, function(tabs) {
for(let i = 0; i<tabs.length; i++){
if (tabs[i].id === tabID) {
alert(`Tab ${tabID} exists!`);
return;
}
}
alert(`No Tab ${tabID} here.`);
});
Ответ 5
Задайте переменную перед
lastRemoved=tab.id;
chrome.tabs.remove(tab.id);
И проверьте его после
chrome.tabs.onUpdated.addListener(function(tabId){
if(lastRemoved==tabId) return;
chrome.tabs.get(tabId,
//...