2011-08-21 2 views
1

У вас возникли проблемы с chrome.tabs.onSelectionChanged.addListener. Все работает хорошо, пока все окно не будет закрыто. Затем этот слушатель запускается ... по какой бы то ни было причине. Для меня это нехорошо, но в любом случае:Расширение Chrome: Вкладка Listener onSelectionChanged

На этом слушателе я работаю с функцией chrome.tabs.get. И эта функция выдает ошибку в момент закрытия окна:

Error during tabs.get: No tab with id: 70. 

Это имеет смысл. В данный момент вкладка больше не существует. У кого-нибудь уже был способ обойти это? Одна из возможных причин - удалить слушателя при закрытии окна. Но, к сожалению, removeListener не работает (если кто знает, как удалить, я благодарен).

Лучшие

EDIT 1,1: Модифицированная функция от подхода для Serg (спасибо за что на этом пути):

Сначала я пытался поймать только вкладки фактического окна с: chrome.windows. getCurrent. Но эта функция не возвращает массив windows.tabs. Поэтому я сначала прочитал текущий windows.id и только прокрутил вкладки этого окна.

function ensureTabExists(tabId, callback) { 
    chrome.windows.getCurrent(function(windows) { 
     var exists = false; 
     windowsId=windows.id; 
     chrome.windows.getAll({populate: true}, function(windows){ 
      loop: 
      for(var w=0;w<windows.length;++w) { 
       if (windows[w].id == windowsId) { 
        for(var t=0;t<windows[w].tabs.length;++t){ 
         if(windows[w].tabs[t].id == tabId) { 
          exists = true; 
          break loop; 
         } 
        } 
       } 
      } 
      if(exists && callback) { 
       callback(); 
      } 
     }); 
    }); 
} 
+0

Если вам нужно только цикл через текущие вкладки окна, а затем просто сделать 'chrome.tabs.getAllInWindow (NULL)' , а не все это. – serg

ответ

2

Вы можете перебрать все вкладки во всех окнах и проверить, если он все еще существует:

function ensureTabExists(tabId, callback) { 
    chrome.windows.getAll({populate: true}, function(windows){ 
     var exists = false; 
     loop: 
     for(w=0;w<windows.length;w++) { 
      for(t=0;t<windows[w].tabs.length;t++){ 
       if(windows[w].tabs[t].id == tabId) { 
        exists = true; 
        break loop; 
       } 
      } 
     } 
     if(exists && callback) { 
      callback(); 
     } 
    }); 
} 

//usage 
chrome.tabs.onSelectionChanged.addListener(function(tabId, selectInfo) { 
    ensureTabExists(tabId, function(){ 
     //this code will run only if tab exists 
    }); 
}); 
+0

Спасибо, серж. Я не хотел убивать «баг» камнем, но на самом деле это единственное решение. Я немного изменил скрипт (см. «Редактирование»). Спасибо за такой подход! –

0

Используйте chrome.window.onRemovedAPI, чтобы отслеживать, когда окна были закрыты. Таким образом, вы можете более эффективно обработать окно закрытия окна.

+0

Да, это то, что я думал. Но мне кажется бесполезным, пока я не смогу удалить слушателя на уровне вкладок. –

+0

Итак, протестируйте его. Триггер chrome.window.onRemoved, конечно, отправляется после chrome.tabs.onSelectionChanged. Чтобы предотвратить ошибку, я должен установить таймер и var, который говорит, что на самом деле окно закрыто. Это более чем уродливое и на самом деле не решение этой проблемы. –

Смежные вопросы