Хранение доказательств вкладок браузера - PullRequest
0 голосов
/ 24 марта 2020

Я хочу сохранить данные о вкладках моего приложения. При фактической реализации он должен хранить свидетельства вкладок в localStorage следующим образом: [{"tabId": 1}, {"tabId": 2}, ...]

Работает нормально, пока вы откройте новые вкладки с небольшой задержкой (просто дождитесь полной загрузки). Но это не сработает, если вы откроете вкладки одну за другой очень быстро (localStorage просто будет постоянно обновлять sh), и если я закрою браузер и снова открою его, вы увидите, что localStorage не удалил все предыдущие элементы (открытые вкладки).

window.addEventListener('load', function(event){
  let tabs = JSON.parse(window.localStorage.getItem('Tabs'));

  if (tabs && tabs.length) {
    tabs.push({tabId: (tabs[tabs.length - 1].tabId + 1)});
    window.localStorage.setItem('Tabs', JSON.stringify(tabs));
    window.sessionStorage.tabId = tabs[tabs.length - 1].tabId;
  } else {
    window.localStorage.setItem('Tabs', JSON.stringify([{tabId: 1}]));
    window.sessionStorage.tabId = 1;
  }
});

window.addEventListener('storage', function(event){
  window.localStorage.setItem('Tabs', event.newValue);
});

window.addEventListener('beforeunload', function(){
  let tabs = JSON.parse(window.localStorage.getItem('Tabs'));

  if (tabs && tabs.length) {
    for (let index = 0; index < tabs.length; index++) {
      if (tabs[index].tabId == window.sessionStorage.tabId) {
        tabs.splice(index, 1);
        window.localStorage.setItem('Tabs', JSON.stringify(tabs));
        window.sessionStorage.removeItem('Tabs');
        break;
      }
    }
  }
});

PS: протестировано на Chrome 80.0

...