2016-09-11 19 views
1

私は元々、マニフェストバージョン1を使用して元々作成した拡張機能を持っています。chrome.tabs.getSelectedchrome.tabs.getAllInWindowはChrome 33で廃止されました。それをもっと新しいものにしたかったのです。マニフェストの現在のアクセス許可はtabsです。私はこれが非同期である必要があるかもしれないと聞きました。固定タブを除外してタブを左に閉じる

存在する拡張子は、選択したタブまたはアクティブなタブの左側にあるALLのタブを閉じるボタンです。

function closeLeftTabs() { 
    var curTab; 
    chrome.tabs.getSelected(null , function(tab) { 
     curTab=tab; 
    }); 
    chrome.tabs.getAllInWindow(null,function(tabs) { 
     for (var i = 0; i < tabs.length; i++) { 
      if (tabs[i].index<curTab.index){ 
       chrome.tabs.remove(tabs[i].id, null); 
      } 
     } 
    }); 
} 
chrome.browserAction.onClicked.addListener(function(tab) {  
     closeLeftTabs(); 
    }); 

私はchrome.tabs.queryのqueryInfoパラメータを使用して(それらを閉じていない)固定タブを無視して、それを更新していないんだけど、ボタンを押したときにJavaScriptがもはや機能します。これまで私が持っていたアイデアがあります。

function closeLeftTabs() { 
    var curTab; 
    chrome.tabs.query({highlighted: true}, function(tab) { 
     curTab=tab; 
    }); 
    chrome.tabs.query({pinned: false},function(tabs) { 
     for (var i = 0; i < tabs.length; i++) { 
      if (tabs[i].index<curTab.index){ 
       chrome.tabs.remove(tabs[i].id, null); 
      } 
     } 
    }); 
} 
chrome.browserAction.onClicked.addListener(function(tab) {  
     closeLeftTabs(); 
    }); 

上記のコードのボタンをクリックすると、何もしないようです。 JavaScriptの経験はあまりなく、新しいパラメータはまだ使用していません。私もcurrentWindowlastFocusedWindowのブール値で実験したが、何も変わっていないので、問題の根本を特定することはできない。

+0

chrome.tabs.queryはコールバックを持つすべてのクロムAPIとasyncなので、次の文が実行されると 'curTab'は未定義です。 「非同期呼び出しからの応答を返すにはどうすればよいですか?」(https://stackoverflow.com/q/14220321)を参照してください。このようなエラーは、素晴らしい組み込みdevtoolsデバッガを使用して数秒で捕捉できます関数の内部にある。 – wOxxOm

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

答えて

2

現在アクティブなタブを取得するには、「アクティブ」プロパティが使用されます。ここに作業コードがあります。

chrome.browserAction.onClicked.addListener(function(tab) { 
    closeLeftTabs(); 
}); 


function closeLeftTabs() { 

    performActionOnCurrentTab(function(activeTab){ 
    if(activeTab) { 
     chrome.tabs.query({currentWindow : true,pinned: false},function(tabs) { 
      for (var i = 0; i < tabs.length; i++) { 
       if (tabs[i].index < activeTab.index){ 
        chrome.tabs.remove(tabs[i].id, null); 
       } 
      } 
     }); 
    } 
}); 


} 

function performActionOnCurrentTab(tabCallback) { 
    chrome.tabs.query({ currentWindow : true, active : true },function (tabArray) { tabCallback(tabArray[0]); }); 
} 
+2

質問のコードはアクティブなタブではなく、「強調表示」タブで動作します(これがOPの意図的なUI選択であるかどうかは不明です)。あなたのリスナーにとって、なぜcloseLeftTabs()を無名関数にラップするのですか(それを直接使うことができます)?アクティブなタブの[Tab.tab](https://developer.chrome.com/extensions/tabs#type-Tab)が既に渡されているときに、アクティブなタブを見つけるために 'chrome.tabs.query'を実行するのはなぜですかタブを 'chrome.browserAction.onClicked'ハンドラに追加しました。 – Makyen

関連する問題