Как я могу выйти из системы пользователя, даже если он не отвечает на запрос JavaScript «confirm()»?

#javascript #php

#javascript #php

Вопрос:

Это был начальный код, который я использовал:

 setInterval(function(){
  r=confirm("You are about to be logged out! Press cancel if you want to remain logged in.");
  if (r == true){
    window.location.href = '../logout.php';
  }else{
    location.reload();
  }
},30000);
 

Диалоговое окно подтверждения ожидает действий от пользователя. Если действие «отмена», они остаются в системе. Если действие «ОК», они перенаправляются на logout.php страница. Проблема в том, что если пользователь не отвечает, он не выходит из системы по истечении этих 30 секунд.

Тогда я подумал, что могу использовать два временных интервала:

 setInterval(function(){
  window.location.href = '../logout.php';
},60000);


setInterval(function(){
  r=confirm("You are about to be logged out! Press cancel if you want to remain logged in.");
  if (r == true){
    window.location.href = '../logout.php';
  }else{
    location.reload();
  }
},30000);
 

но поскольку метод confirm () останавливает скрипт, 60000 мс никогда не выполняются. Есть ли способ заставить это работать?

Комментарии:

1. Вы спрашиваете своих пользователей каждые 30 секунд, хотят ли они оставаться в системе?

2. 1 минута — это просто пример. Это не актуальная проблема здесь. Я мог бы написать 600000.

3. То, что я пытался сказать, — это то, что вам, вероятно, следует переосмыслить эту концепцию. Представьте, что вы пишете вопрос в Stackoverflow, диалоговое окно подтверждения открывается точно в тот момент, когда вы собираетесь нажать enter. Вы вышли из системы, и ваш вопрос исчез.

4. Вы правы, подтверждение останавливает скрипт. Если вы хотите, чтобы скрипт продолжал выполняться в фоновом режиме, вам может быть лучше использовать модальный формат на основе HTML.

5. Скажем, если они просто покидают свой рабочий стол или закрывают браузер, не отвечая.

Ответ №1:

Вот мое предложение

  1. запустите таймер, который выводит пользователя из системы
  2. запустите graceTimer, чтобы показать ссылку
  3. при нажатии на ссылку таймеры перезапускаются
  4. если нет, пользователь выходит из системы

https://jsfiddle.net/mplungjan/t5ejs72q/

 let tId, tId1;
const end = 15000, // change to whatever - 30 minutes
  grace = 3000, // 3 secs - should be 30 secs in real life
  timer = () => {
    clearTimeout(tId);
    tId = setTimeout(function() {
      // location.replace('../logout.php')
      console.log("logged out")
    }, end);
  },
  graceTime = () => tId1 = setTimeout(toggleGrace, end - grace),
  toggleGrace = () => document.getElementById("stayLink").classList.toggle("hide"),
  init = () => {
    timer();
    graceTime()
  };

document.getElementById("stayLink").addEventListener("click", function(e) {
  e.preventDefault();
  toggleGrace();
  init()
})
init() 
 .hide {
  display: none;
} 
 <a href="#" id="stayLink" class="hide">Stay logged in?</a>