非アクティブなタブでのJavaScriptの動作について
システム内の同機能の画面を2つ以上のタブ・ウィンドウでの表示を禁止するために以下ような動作となる処理を実装しようとしています。
①同一機能で二つ目のタブが開かれたとき
②既に開かれていたタブにアラートを表示する
③アラートのOKが押下されたときに既に開かれていたタブを閉じる
現在のソースとしては以下なのですが、①の直後に非アクティブな状態の既に開かれていたタブが閉じる処理まで実行されてしまいます。
二つめのタブを開いた直後に既に開かれていたタブをアクティブした場合は、アラートが表示されるところで処理が停止します。
私が期待している動作をさせることは可能でしょうか。あるいは近い動作をさせる方法があれば教えていただきたいです。
//呼び出す処理
let tabId = 'company-edit';
$(function () {
setInterval(function () {
callback(tabId)
}, 1000);
});
//複数タブ禁止処理
let issuedAlready = false;
const callback = openedTabId => {
forbidMultiTab(openedTabId);
};
function forbidMultiTab(openedTabId) {
let tabId = openedTabId;
let sessionTabId = sessionStorage.getItem(tabId);
let localTabId = localStorage.getItem(tabId);
let newAction = function () {
let tabID = new Date().getTime();
sessionStorage.setItem(tabId, tabID);
localStorage.setItem(tabId, tabID);
issuedAlready = true;
};
let currentAction = function () {
};
let oldAction = function () {
alert('この機能は同時に複数のウィンドウ・タブで開くことができません');
window.open('about:blank', '_self').close();
};
if (sessionTabId == null || (sessionTabId === localTabId && !issuedAlready)) {
// sessionStorageにタブIDが保存されていないとき
// もしくはIE8対応として、「新しいタブで開く」から開くと、sessionStorageの値がコピーされているので、発番フラグが立っていないとき
newAction();
} else if (sessionTabId === localTabId) {
// sessionStorageの値とlocalStorageの値が等しいとき
currentAction();
} else {
oldAction();
}
}