jQuery продолжается, даже если пользователь покинул страницу

Я хочу создать страницу, на которой запускается сценарий jQuery, когда пользователь попадает на страницу и запрос выполняется, даже если пользователь покидает страницу или закрывает браузер. Это возможно?

if(localStorage.getItem("counter")){
  if((localStorage.getItem("counter") >= 300) || (localStorage.getItem("counter") <= 0)){
    var value = 300;
  }else{
    var value = localStorage.getItem("counter");
  }
}else{
  var value = 300;
}
document.getElementById('divCounter').innerHTML = value;

var counter = function (){
  if(value <= 0){
    localStorage.setItem("counter", 0);
    value = 0;
    $( ".exit" ).trigger( "click" );
  }else{
    value = parseInt(value)-1;
    localStorage.setItem("counter", value);
  }
  document.getElementById('divCounter').innerHTML = value;
};

var interval = setInterval(function (){counter();}, 1000);

Это мой сценарий. Для более подробной информации, это обратный отсчет от 300, когда пользователь попадает на страницу, он запускается, и я хочу, чтобы он работал, даже если пользователь покинул страницу, пока он не получит 0.


person reza    schedule 24.01.2017    source источник
comment
Поскольку JQuery запускается в браузере, вам нужен серверный язык.   -  person Mihai    schedule 24.01.2017
comment
Нет, невозможно выполнить код на незагруженной странице. Есть кое-что, что вы можете сделать, например, выполнить вашу логику на серверном языке или, возможно, сохранить состояние страницы в локальном хранилище и проверить его при следующей загрузке страницы пользователем, и т.д. Но вы не можете произвольно выполнять код вне контекста страницы в браузере.   -  person David    schedule 24.01.2017
comment
Закрытие браузера или просто страницы остановит выполнение любого JS-кода. JS - это клиентская сторона. Я думаю, что единственное исключение будет для вызовов AJAX, которые запустили некоторый запрос к службе, и, следовательно, служба, получившая запрос, будет продолжать работать до тех пор, пока не будет завершена. Но тогда это все равно не будет на стороне клиента.   -  person melancia    schedule 24.01.2017
comment
Лучшим способом сделать это даже смоделировать (и он будет применяться только в том случае, если пользователь повторно посещает страницу до истечения времени) было бы использование localStorage - если вы сохраните время запуска таймера в localStorage (или cookie ), затем либо когда таймер достигнет нуля, либо когда страница перезагрузится, сравните время начала с истекшим временем. Это потребует некоторого размышления, но может имитировать то, что вы хотите.   -  person Snowmonkey    schedule 24.01.2017
comment
Вы можете выполнить сценарий до того, как пользователь покинет страницу. stackoverflow.com/questions/28627111/. Но нет возможности выполнить сценарий после того, как вы покинули страницу.   -  person Anthony C    schedule 24.01.2017


Ответы (1)


Осмелюсь ответить на ваш вопрос и тем не менее надеюсь, что это вам поможет. Нет возможности запустить этот js-код после закрытия этой вкладки, но вы можете запомнить время, когда пользователь покинул ваш сайт, установив time_leave, который устанавливается на каждом интервальном раунде и когда пользователь покидает ваш сайт с помощью onbeforeunload:

var value;
if (localStorage.getItem('counter')) {
  if ((localStorage.getItem('counter') >= 300) || (localStorage.getItem('counter') <= 0)) {
    value = 300;
  } else {
    value = getElaspedTime();
  }
} else {
  value = 300;
}

document.getElementById('divCounter').innerHTML = value;

var counter = function () {
  if (value <= 0) {
    localStorage.setItem('counter', 0);
    value = 0;
    //$('.exit').trigger('click');
  } else {
    value = parseInt(value) - 1;
    localStorage.setItem('counter', value);
  }
  document.getElementById('divCounter').innerHTML = value;
  // set "departure"-time
  localStorage.setItem('time_leave', (new Date()).getTime());
};

function getElaspedTime() {
  var now = new Date();
  var timeLeft = + localStorage.getItem('time_leave');
  timeLeft = new Date(timeLeft);
  var passedSecs = (now.getTime() - timeLeft.getTime()) / 1000;
  return parseInt(localStorage.getItem('counter')) - parseInt(passedSecs);
}

window.onbeforeunload = function(){
  // set "departure"-time when user closes the tap
  localStorage.setItem('time_leave', (new Date()).getTime());
};

var interval = setInterval(function () {
  counter();
}, 1000);
person Blauharley    schedule 24.01.2017
comment
Благодарю. это решило проблему. но есть ли способ не запускать window.onbeforeunload при обновлении страницы. просто запустите его, когда страница закрыта. - person reza; 24.01.2017
comment
Добро пожаловать! Извините, я только что нашел на перед загрузкой и выгрузкой. - person Blauharley; 24.01.2017
comment
И все равно спасибо, потому что он даже не был закончен (кажется, день был слишком длинным). Мой ответ был обновлен. - person Blauharley; 24.01.2017