これは自分の質問に答えるためのもので、インラインでコメントしています。
この単純な例では、すべてのページャが最上位ディレクトリにあると想定していますが、これは任意で簡単に変更できます。
1) 'の.html')なし(ページ名を保持するグローバルオブジェクトtabIDs
:
は、本質的に、それは、4つの部分からなります。これを拡張子を含むフルパスに変更するか、ページ名を短い名前にして、パス名などの別のオプションを使用するようにテクニックを変更してください。
2)非同期機能新しい待ち受け機能の名前)をtabCreate
とし、既に開いているかどうかを判断して、そのタブに切り替えるか、新しいタブを作成します。
3)onRemovedイベントハンドラは、タブが閉じられた後にtabIDs
のクリーンアップを処理します(該当する場合)。
4)使用例、コンテキストメニュー項目から、デモの目的のためだけに、ここで、この質問には使用していませんが、別の質問の一部であり、そしていくつかのpage
とpanel
オプションを渡します。
background.js:
// tabID contexts
// global var to keep track of different tabs,
// i.e. options.html, popup.html and so on.
var tabIDs = {
'options': null,
'popup': null,
}
// Requires Firefox 52.0+ to use async/await
// opts correspond to contexts above in tabIDs
// of the form { 'page': 'options' } or { 'page': 'popup' }
// note if using Node.js, this may require v7+ and --harmony_async_await
async function tabCreate (opts) {
var tab;
if (tabIDs[ opts.page ] !== null) {
// should probably bring window to front first... oops
// ..
// switch to tab
tab = await browser.tabs.update(tabIDs[ opts.page ], { active: true });
} else {
tab = await browser.tabs.create({
'url': opts.page + '.html'
});
tabIDs[ opts.page ] = tab.id;
}
console.log('**** opts.page = ' + opts.page + ', opts.tab = ' + opts.tab + ', tab.id = ' + tab.id);
}
// When tabs are closed, see if the tabID is in tabIDs,
// and if so, set it to null
function tabRemove (tabID, removeInfo) {
console.log('Closed TAB ' + tabID);
Object.keys(tabIDs).forEach(function(key, index) {
if (tabIDs[ key ] === tabID) {
tabIDs[ key ] = null;
return;
}
});
}
browser.tabs.onRemoved.addListener(tabRemove);
/*
* Context Menus
*/
browser.contextMenus.removeAll();
browser.contextMenus.create({
title: 'My Web Extension',
contexts: [ 'browser_action' ],
});
browser.contextMenus.create({
title: 'Options',
contexts: [ 'browser_action' ],
onclick: myWebExt_Options
});
function myWebExt_Options () {
tabCreate({
'page': 'options',
'panel': 1,
});
}
別のアプローチは、各ページにイベントリスナーを追加し、閉じたときに、バックbackground.jsにメッセージを送信するかもしれないが、それはほとんど、あるいはまったくとはるかに複雑なようです利益。
あなたは複数の質問をしています:1)あなたが開いているタブにパラメータを渡してください(私の意見では、説明したものよりも簡単で、バックグラウンドで両方のページに対応できる方法がありますコンテキストスクリプトとコンテンツスクリプト)。 2)目的のURLを含むタブが開いているかどうかを確認し、そうであればフォーカスを合わせます。 3)[一般的にバックグラウンドコンテキストでページ間でメッセージを送信する](http://stackoverflow.com/a/41420772/3773011)。これらの3つのことは別々の質問です。それらを[別の質問](http://stackoverflow.com/questions/ask)に分けてください。 – Makyen
私はこの質問を書いたとき、私はちょうど私の考えを集めていたと思います。編集して他の質問を作成します。 – user314159
問題はありません、私はそれがどのように行くことができるか知っています。正式には、私はこの質問をあまりにも広すぎる(問題ごとに1つの問題)として締め切るべきだった。もっと緊密に集中すれば、これは良い質問になると私は信じています。私は1&2のやり方に関するアイデアを持っています.1のために、私はそれをやる方法について考えています。あなたのアウトラインされたメソッドは、他に何をしているかによっても機能し、最も適切かもしれません。 2のために、私は他のもののために使った部分的なコードを持っています。 3については、明らかに、私はすでにリンクされた答えを提供しています。質問を更新したり、質問を更新したりするときに私にpingしてください。 – Makyen