Anopeng
@Anopeng
Веб-программист, учу фронт и бек

Как понять если мой скрипт открыт в еще одной вкладке?

Всем привет!
Мне нужно, чтобы скрипт работал только в одной вкладке. Если открыты еще вкладки с этим скриптом, то непосредственно они - не выполняются. Скрипт Tampermonkey.

Вот моя текущая реализация. Как сделать лучше или вообще по-другому?
const stg_config = {
  opened: 'tab-counter'
}
Array.prototype.count = function (w) {
    let c = 0;
    for (let el of this) {
        if (el === w) c++;
    }
    return c;
}
function anotherTab() {
  return new Promise(function (res, rej) {
      let queue = [];
      let check = setInterval(() => {
          queue.push(localStorage.getItem(stg_config.opened));
          if (queue.length == 3) {
              clearInterval(check);
              let result = false;
              for (let i = 0; i < 3; i++) {
                  if (queue.count(queue[i]) == 1) {
                      result = true;
                      break;
                  }
              }
              res(result);
          }
      }, 1000);
      setTimeout(() => rej('Sth went wrong'), 10000);
  });
}
async function reserveTab() {
    if (await anotherTab()) return false;
    setInterval(() => localStorage.setItem(stg_config.opened, +Date.now()), 1000);
    return true;
}
(async function () {
  if (!await reserveTab()) return;
  //...
})();
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно использовать шину обмена сообщениями BroadcastChannel – есть во всех современных браузерах.

Не совсем понял задачу. Если достаточно отключать остальные, когда новая вкладка запускает скрипт, то новичок просто запускает сообщение «всем молчать!» (все выключаются) и начинает сам слушать сообщения, пока ещё одна вкладка не появится с предложением остальным выключиться.

Если нужно вести список вкладок, добавлять новую, при отключении активной, снова запускать одну из заглушенных — чуть сложнее. Скрипт, запускаясь, генерит уникальный ID для себя. Так он сможет отличать себя от других. Нужно поддерживать где-то общий массив вкладок – это можно и в LocalStorage.
Сложный момент - снова запустить скрипт в одной из заглушенных вкладок, когда закрылась активная. Закрытие вкладки не генерит обрабатываемого события, поэтому придётся как-то с таймерами постоянно проверять, «а не запуститься ли мне?». Может что-то умнее можно придумать.. Сейчас лень )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы