Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.05.2022, 11:53
Новичок на форуме
Отправить личное сообщение для levy Посмотреть профиль Найти все сообщения от levy
 
Регистрация: 17.05.2022
Сообщений: 4

Отслеживание закрытия страницы или ухода с нее и изменение значения переменной в БД
Пишу сайт на фрейме yii2. Понадобилось сделать монопольный доступ к странице редактирования формы update. Для этого использую две переменные edit_on и editor, первая булевая (1 - доступ разрешен, 0 - занят) и во вторую заношу id пользователя, который редактирует, чтобы показывать его другим. При сохранении формы возвращаю edit_on 1 и очищаю editor. Однако нужно отследить, когда пользователь уходит со страницы, не сохранив форму. Была идея отправлять ajax запросы на сервер с обновлением переменной last_update каждые 30 секунд, но это будет загружать сервер. Поэтому появилась другая идея: отследить момент закрытия страницы, и во время него отправить запрос на обновление этих двух переменных.

В js я новичок, поэтому не понимаю, как именно написать часть скрипта, отвечающую за обновление двух переменных в БД. И подходит ли .bind или лучше добавить новый слушатель?

$(window).bind('beforeunload',function(event){/*тут запись переменных*/});
Ответить с цитированием
  #2 (permalink)  
Старый 17.05.2022, 13:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

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

Если вы не предполагаете использовать старые браузеры (типа IE), то для отслеживания на сервере закрытия страницы, можно использовать
navigator.sendBeacon()

https://developer.mozilla.org/ru/doc...tor/sendBeacon
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2022, 11:17
Новичок на форуме
Отправить личное сообщение для levy Посмотреть профиль Найти все сообщения от levy
 
Регистрация: 17.05.2022
Сообщений: 4

IE не используется. Проверил поддержку остальных браузеров, все есть. Можете подсказать, пожалуйста, как именно тогда задать изменение значений в БД. Пока не разбираюсь в этом.

function changeEdit(){
var data = {edit_on:1,editor:""};
navigator.sendBeacon(document.URL,data);
};

window.addEventListener('beforeunload', chandeEdit);


Как я понимаю, то этим кодом просто передаются post значения на страницу update. А как их записать в саму таблицу?

Последний раз редактировалось levy, 18.05.2022 в 11:44.
Ответить с цитированием
  #4 (permalink)  
Старый 18.05.2022, 12:10
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от levy
Можете подсказать, пожалуйста, как именно тогда задать изменение значений в БД. Пока не разбираюсь в этом.
Это же ваша БД, и только вы должны знать, что и как туда передавать и как изменять.

Только событие не 'beforeunload' а 'unload' должно быть.

Закрытие страницы и уход с нее - разные вещи, если под уходом понимать переключение на другую вкладку или другое окно.
Что именно вам отслеживать надо?

Последний раз редактировалось voraa, 18.05.2022 в 12:15.
Ответить с цитированием
  #5 (permalink)  
Старый 18.05.2022, 12:34
Новичок на форуме
Отправить личное сообщение для levy Посмотреть профиль Найти все сообщения от levy
 
Регистрация: 17.05.2022
Сообщений: 4

Нужно отслеживать закрытие страницы или переход в ней на другой url.

По поводу записи не понимаю, как вообще с помощью js можно произвести запись и возможно ли? Или можно ли вызвать исполнение фоновое php с записью в бд?
Ответить с цитированием
  #6 (permalink)  
Старый 18.05.2022, 15:21
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от levy
По поводу записи не понимаю, как вообще с помощью js можно произвести запись и возможно ли?
А на кой вам вообще с помощью js базу трогать, если у вас на беке yii? Отправили запрос на backend, backend внес изменения в бд.
Ответить с цитированием
  #7 (permalink)  
Старый 19.05.2022, 11:26
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от levy
Или можно ли вызвать исполнение фоновое php с записью в бд?
Не фоновое, а выполнение php на сервере.
https://developer.mozilla.org/ru/doc...tor/sendBeacon
Там же есть пример, как обратиться к серверу

navigator.sendBeacon("/log", analyticsData); - это и есть обращение к серверу, но без получение отвера от него.
url может быть любым, например какой-нибудь http://myserver.ru/bla-bla/script.php
Ответить с цитированием
  #8 (permalink)  
Старый 19.05.2022, 13:19
Новичок на форуме
Отправить личное сообщение для levy Посмотреть профиль Найти все сообщения от levy
 
Регистрация: 17.05.2022
Сообщений: 4

Я создал в контроллере экшн для записи:

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 запрос без параметров.

Последний раз редактировалось levy, 20.05.2022 в 13:33.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение значения переменной в куках или передача через ajax tvixa Элементы интерфейса 1 04.02.2016 07:57
Значения переменной из др. страницы yura_yushkevich Events/DOM/Window 20 25.02.2015 20:09
Сохранение данных после закрытия страницы HekracoB AJAX и COMET 12 02.01.2015 12:41
Запрет обновления страницы и ухода с неё пока открыто модальное окно. psfdek Элементы интерфейса 0 13.06.2014 18:46
Изменение и отображение значения переменной по клику Allan Stark Общие вопросы Javascript 1 25.04.2010 15:50