2011-08-21 26 views
1

chrome.tabs.onSelectionChanged.addListenerに問題がありました。ウィンドウ全体が閉じられるまで、すべてがうまくいきます。そして、このリスナーは何らかの理由で誘発されます。私にとってはちょっとバグですが、とにかく:Chrome拡張機能:タブリスナーonSelectionChanged

このリスナーでは、chrome.tabs.get関数を使って作業しています。そして、この機能は、ウィンドウが閉じた瞬間にエラーを投げています:

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

これは意味があります。この瞬間にタブは存在しなくなりました。誰もがこれを回避する方法をすでに持っていたのですか? 1つの理由は、ウィンドウを閉じるときにリスナーを削除することです。しかし残念なことに、removeListenerは機能しません(誰かが削除する方法を知っていれば、私は感謝しています)。

ベスト

EDIT 1.1:sergのアプローチから変更された機能(このようにそのためのTHX):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を設定する必要があります。これは、この問題の解決策ではありません。 –

関連する問題