Отслеживание закрытия страницы или ухода с нее и изменение значения переменной в БД
Пишу сайт на фрейме yii2. Понадобилось сделать монопольный доступ к странице редактирования формы update. Для этого использую две переменные edit_on и editor, первая булевая (1 - доступ разрешен, 0 - занят) и во вторую заношу id пользователя, который редактирует, чтобы показывать его другим. При сохранении формы возвращаю edit_on 1 и очищаю editor. Однако нужно отследить, когда пользователь уходит со страницы, не сохранив форму. Была идея отправлять ajax запросы на сервер с обновлением переменной last_update каждые 30 секунд, но это будет загружать сервер. Поэтому появилась другая идея: отследить момент закрытия страницы, и во время него отправить запрос на обновление этих двух переменных.
В js я новичок, поэтому не понимаю, как именно написать часть скрипта, отвечающую за обновление двух переменных в БД. И подходит ли .bind или лучше добавить новый слушатель? $(window).bind('beforeunload',function(event){/*тут запись переменных*/}); |
beforeunload можно использовать, что бы предупредить пользователя, что он что то не сохранил, что бы дать ему возможность самому сохранить данные перед закрытием страницы.
Если вы не предполагаете использовать старые браузеры (типа IE), то для отслеживания на сервере закрытия страницы, можно использовать navigator.sendBeacon() https://developer.mozilla.org/ru/doc...tor/sendBeacon |
IE не используется. Проверил поддержку остальных браузеров, все есть. Можете подсказать, пожалуйста, как именно тогда задать изменение значений в БД. Пока не разбираюсь в этом.
function changeEdit(){ var data = {edit_on:1,editor:""}; navigator.sendBeacon(document.URL,data); }; window.addEventListener('beforeunload', chandeEdit); Как я понимаю, то этим кодом просто передаются post значения на страницу update. А как их записать в саму таблицу? |
Цитата:
Только событие не 'beforeunload' а 'unload' должно быть. Закрытие страницы и уход с нее - разные вещи, если под уходом понимать переключение на другую вкладку или другое окно. Что именно вам отслеживать надо? |
Нужно отслеживать закрытие страницы или переход в ней на другой url.
По поводу записи не понимаю, как вообще с помощью js можно произвести запись и возможно ли? Или можно ли вызвать исполнение фоновое php с записью в бд? |
Цитата:
|
Цитата:
https://developer.mozilla.org/ru/doc...tor/sendBeacon Там же есть пример, как обратиться к серверу navigator.sendBeacon("/log", analyticsData); - это и есть обращение к серверу, но без получение отвера от него. url может быть любым, например какой-нибудь http://myserver.ru/bla-bla/script.php |
Я создал в контроллере экшн для записи:
public function actionEdit() { $id = Yii::$app->request->post('id'); $sql = 'UPDATE report SET edit_on = 1 WHERE id = '.$id; $connection = \Yii::$app->db->createCommand($sql)->execute(); } Соответственно изменил скрипт: function changeEdit(){ var id = '<?= $model->id?>'; var data = {id:id}; navigator.sendBeacon("/report/edit",data); }; window.addEventListener('unload', chandeEdit); Однако почему-то передается пустой post запрос без параметров. |
Часовой пояс GMT +3, время: 15:09. |