Подтвердить что ты не робот

Лучший способ проверить, есть ли вкладка с точным идентификатором в 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."

4b9b3361

Ответ 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,
    //...