Ребят у меня на сайте есть запись по календарю на время и что бы не получилось так когда первый который кликнул на время допустим 30.10.17 12:45 и попал на страницу заполнения данных и пока он не заполнит полностью данные и не нажмет кнопку записаться то второй может кликнуть на этоже время и записаться раньше первого я это решил тем что бронирурую время уже при клике на время и в сессии храню id записи а потом просто обновляю ее но тут проблема если человек кликнул на время и ушел с сайта то оно так и остается на половину пустым и будет висяк. Как решить данную проблему какие идеи.
Можно сделать так, установи время для юзера на заполнения данных ну например 2 минуты, если он по времени не успел заполнить форму, уничтожай сессию, вот и все.
На клиенте в JS ловим событие "beforeunload" и отправляем Ajax-запрос на снятие брони. Стоит учитывать, что событие сработает как при закрытии страница, так и при переходе на другую страницу. Для большей уверенности, делайте Ajax-запрос синхронный, хотя у меня и с асинхронным проблем не возникало. И можно сюда же прикрутить то, что посоветовал @_ne_scaju_, но только опять же сделать реализацию на клиенте: таймер отслеживающий активность: mousemove, keydown, scroll - вполне достаточно. Если в течении N минут ни одно событие не произошло, то выполняем такой-же Ajax-запрос, а после его завершения редиректим юзера на какую-то другую страницу сайта.
Не вариант. Вот ты представь он выбрал время которое было свободно перешел к заполнению и сидит минут 10 тут пока он сидит кто то на это время записался и он отправляет данные ему в ответ время занято он подумает что сайт не работает потому что было ведь свободно и уйдет. Короче не варик. А вот те что выше вариант. я вот пробовал через beforeunload но у меня чето не получилось ну не отправлялся запрос может действительно нужно асинхроно попробовать. а можно ваш пример как вы делали может что то не правильно писал. Моего уже нет так как просто тестил и не получилось удалил.
Под рукой есть с использованием jQuery. Подойдёт? Код (Javascript): var idleTimer = null, idleWait = 1000 * 60 * 5; // 5 минут неактивности // Отслеживание активности пользователя $(document).on('mousemove keydown scroll', function() { clearTimeout(idleTimer); idleTimer = setTimeout(function() { // По истечении idleWait-времени, перенаправляем на другую страницу location.href = 'http://natribu.org/'; }, idleWait); }).trigger('mousemove'); // Снятие брони $(window).on('beforeunload', function() { $.ajax({ url: '/path/to/handler.php', // путь к обработчику type: 'POST', async: false, data: { action: 'removeReserve' // какая-нибудь метка } }); }); Чуть подправил под вашу задачу, но не тестировал
да пойдет спасибо --- Добавлено --- Слушай а befunload должен выполняться в document.ready ? и еще такой вопрос а если это просто обновление страници вот я написал твой код в doument.ready все работает указал async false. А как отследить обновление страници если он просто обновил страницу то тоже запись затирается
Нет, не обязательно Понятное дело. Пробуйте так Код (Javascript): var idleTimer = null, idleWait = 1000 * 60 * 5, // 5 минут неактивности isRefresh = false; // флаг: обновление страницы или нет $(document).on('mousemove keydown scroll', function(e) { clearTimeout(idleTimer); idleTimer = setTimeout(function() { // По истечении idleWait-времени, перенаправляем на другую страницу location.href = 'http://natribu.org/'; }, idleWait); if (e.type === 'keydown' && e.which === 116) { isRefresh = true; } }).trigger('mousemove'); // Снятие брони $(window).on('beforeunload', function() { if (isRefresh) { return false; } $.ajax({ url: '/path/to/handler.php', // путь к обработчику type: 'POST', async: false, data: { action: 'removeReserve' // какая-нибудь метка } }); });
(window) вроде связан с событием закрытии вкладки || браузера при отключении эл.ства в доме - пупец --- Добавлено --- https://developer.mozilla.org/ru/docs/Web/API/Window
неа все ровно затирает при перезагрузке( а это на ф5 повешено событие тогда норм. Нов вот при нажатии в браузере на кнопку перезагрузить всеровно затирает.
я вот написал так Код (Javascript): if (isRefresh || loc.indexOf("/zakaz/?")) { return false; } --- Добавлено --- и работает в loc собираю Код (Javascript): var loc = window.location.pathname; loc = loc+''+window.location.search; --- Добавлено --- только создавать нужно переменную в событии beforeunload что бы она обновлялась. --- Добавлено --- я вот чуток потестил как то через раз работает