Отображение таймера сеанса Java-скрипта для нескольких вкладок

Я использую таймер обратного отсчета Java-скрипта для тайм-аута сеанса.

Он отлично работает для одной вкладки, но если страница обновляется или открывается другая вкладка той же страницы, таймер сбрасывается.

Есть ли способ использовать все страницы с одного таймера?

Вот мой код таймера:

var mins = 1;  //Set the number of minutes you need
var secs = mins * 60;
var currentSeconds = 0;
var currentMinutes = 0;
/*
 * The following line has been commented out due to a suggestion left in the comments. The line below it has not been tested.
 * setTimeout('Decrement()',1000);
 */
setTimeout(Decrement, 1000);

function Decrement() {
    currentMinutes = Math.floor(secs / 60);
    currentSeconds = secs % 60;
    if (currentSeconds <= 9) currentSeconds = "0" + currentSeconds;
    secs--;
    document.getElementById("timerText").innerHTML = "Your session remaining(" + currentMinutes + ":" + currentSeconds + ")"; //Set the element id you need the time put into.
    if (secs !== -1) setTimeout('Decrement()', 1000);
}  
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
736
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать API PostMessage для связи между окнами.
Или вы также можете использовать LocalStorage и его событие «хранилище».

const EL_text = document.getElementById("timerText");
let remaining = 30;
let remainingItv = null;

function Decrement() {  // Just a simplification - example
  remaining -= 1;
  localStorage.remaining = remaining;  // Store the time
}

window.addEventListener("storage", () => {

  EL_text.textContent = localStorage.remaining;    // Use the value here!

  if (localStorage.remaining == "0") {
    localStorage.removeItem("remaining"); // Remove key from localStorage
    clearInterval(remainingItv);
  }
});

// Init!
// Only initiate of there's no "remaining" key inside localStorage
if (undefined === localStorage.remaining) {
  remainingItv = setInterval(Decrement, 1000);
}

Спасибо, Роко, но это работает неправильно.

Taymaz 10.12.2020 16:53

Определите свое время в локальном хранилище браузера и тогда оно будет доступно на всех вкладках/окнах

Просто извлеките значение таймера из локального хранилища при обновлении страницы и, если оно не существует, создайте его и сохраните в локальном хранилище.

  1. Хранение объектов в HTML5 localStorage
  2. localstorage и setInterval() с несколькими вкладками
  3. обменивайтесь данными между вкладками браузера с помощью localstorage

Вы можете сохранить текущее значение (время) таймера для каждой вкладки в localStorage каждые N интервалов, в зависимости от таймфрейма, а затем, когда/если откроется новая вкладка, она будет получать «последнее» значение таймера.

Ответ принят как подходящий

Прежде всего, вы никогда не должны полагаться на setTimeout() для отображения времени, так как это не точно. Они выполняются в одном потоке с другими операциями, и они будут сильно отклоняться, если для выполнения других операций потребуется время.

Пока я пишу этот ответ, уже есть несколько хороших ответов, опубликованных разными полезными участниками, но это просто ответы только по ссылкам.

Одним из распространенных решений является использование поддержки серверных технологий, но помимо очевидного, если вы собираетесь полагаться только на решение javascript, вам нужно будет записать временную метку в какое-то хранилище браузера или файлы cookie. Затем вычислите разницу между текущим временем и начальной отметкой времени, чтобы показать таймер сеанса.

ПРИМЕЧАНИЕ. Следующий пример будет работать только в размещенной среде, поскольку он зависит от той же политики происхождения. Выполнение в консоли разработчика не будет работать.

var startTime;
if (sessionStorage) {
  // Ask other tabs for session storage
  localStorage["getTmestamp"] = "get";

  window.addEventListener("storage", (event) => {
    if (event.key == "getTmestamp") {
      // Some tab asked for the sessionStorage -> send it
      localStorage["timestamp"] = sessionStorage["timestamp"];
      localStorage.removeItem("getTmestamp");
    } else if (event.key == "timestamp" && !sessionStorage["timestamp"]) {
      sessionStorage["timestamp"] = new Date(localStorage["timestamp"]);
      localStorage.removeItem("timestamp");
    }
  });
} else {
  console.warn("Browser doesn't support sessionStorage");
}
var interval = setInterval(() => {
  if (!startTime && sessionStorage && !sessionStorage["timestamp"]) {
    sessionStorage["timestamp"] = new Date();
  }
  startTime = new Date(sessionStorage["timestamp"]);
  var currentTime = new Date();
  var timeElapsed = Math.ceil((currentTime - startTime) / 1000);
  var remainingTime = 30 - timeElapsed;
  if (remainingTime <= 0) {
    console.info("Timeout");
    clearInterval(interval);
  }
  console.info("Session Time in seconds:", timeElapsed);
  console.info("Remaining Session Time in seconds:", remainingTime);
}, 500);

Спасибо. Но как я могу это проверить?

Taymaz 10.12.2020 16:46

@Taymaz Локальный сервер, такой как xampp, также может работать на локальном хосте, или, может быть, вы можете добавить к нему фиктивный хост. Если у вас есть доступ к веб-хостингу, то он будет работать и там. Идея в том, что у вас должен быть какой-то домен для прохождения той же политики происхождения.

Kiran Shakya 11.12.2020 07:28

Другие вопросы по теме