#javascript #php #laravel
#javascript #php #laravel
Вопрос:
Сейчас я занимаюсь каким-то проектом Laravel. можем ли мы предотвратить многократное открытие одних и тех же форм в браузере? случай выглядит следующим образом :
- Допустим, я открываю вызов формы «Форма данных 1». эта страница все еще открыта
- затем, когда я открываю другую вкладку и снова открываю ту же форму «Форма данных 1»
могу ли я предотвратить вторую вкладку для этого. Или написать всплывающее предупреждающее сообщение о закрытии вкладки с помощью javascript? возможно, во всплывающем предупреждающем сообщении, когда пользователь нажимает закрыть вкладку, будет запущен этот код window.close()
Пожалуйста, помогите. Я не имею ни малейшего представления об этом.
Комментарии:
1. почему вас это волнует? Какую проблему это создает, если пользователь делает это?
2. я думаю. если пользователь внесет изменения на второй вкладке и сохранит их. на первой вкладке по-прежнему будут отображаться старые данные.
3. P.S. Как получилось, что вы понятия не имеете, как это решить? Вы, конечно, не первый, кто рассматривает такое требование — посмотрите здесь
4. почти уверен, что веб-разработка не заботится об условиях гонки, вероятно, потому, что это глупо делать … просто подумайте, если одна и та же форма открыта на 2 компьютерах, как вы собираетесь этим управлять?
5. Если вы беспокоитесь о том, что дальнейшие обновления перезапишут новые данные, вы всегда можете проверить время последнего обновления при отправке формы и сравнить его с отметкой времени в скрытом поле формы, которая сообщает вам, была ли эта копия формы загружена до последнего обновления той же записи — это, вероятно, проще и удобнее для пользователя, чем пытаться управлять вкладками в браузере, и работает на нескольких устройствах / браузерах тоже. В конечном счете браузер принадлежит пользователю, а не вам, поэтому пытаться контролировать, как они его используют, — плохой UX.
Ответ №1:
Хотя я не могу понять, зачем вам это нужно.
Но если вы хотите синхронизировать обе вкладки, у вас есть два варианта:
1- не самый лучший вариант: напишите js-скрипт на стороне клиента для извлечения обновленных данных с сервера через определенный интервал.
2-лучший вариант: используйте push-сервис, поэтому, если какие-либо данные изменились, сервер отправит обновленные данные по всем открытым каналам. этот способ довольно сложный в реализации, потому что вам приходится много работать, чтобы убедиться, что вы отправляете обновленные данные в правильный идентификатор токена.
И если вы хотите предотвратить открытие одной и той же вкладки. вам нужно написать js-скрипт, чтобы при открытии вкладки он запрашивал сервер, можно ли ее открыть, и после этого каждые 3 секунды пинговал сервер, чтобы заблокировать страницу на 5 секунд. Поэтому, если вторая вкладка попытается и спросит сервер, все ли в порядке, сервер отклонит запрос, и вы можете закрыть вкладку с помощью javascript. если пользователь закроет первую вкладку, максимум через 5 секунд пользователь сможет открыть другую вкладку и получить данные с сервера.
Ответ №2:
Я могу понять, зачем вам это нужно, поскольку это довольно распространенный случай, особенно если записи могут редактироваться разными пользователями, к сожалению, я боюсь, что вы не сможете сделать это с помощью простого JS. Вместо этого вам следует создать таблицу DB для хранения состояний ie locked_records
:
Важно понимать, что одна запись может редактироваться многими пользователями и / или одним пользователем, но с использованием совершенно разных устройств в одно и то же время.
SQL
CREATE TABLE `locked_records` (
`uid` int(10) unsi&ned NOT NULL AUTO_INCREMENT,
`tstamp` int(10) unsi&ned NOT NULL DEFAULT '0',
`userid` int(10) unsi&ned NOT NULL DEFAULT '0',
`username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`record_table` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`record_uid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`),
KEY `event` (`userid`,`tstamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Таким образом, когда пользователь начинает редактировать запись, вы можете вставить строку в свою locked_records
с текущей меткой времени, именем таблицы, uid записи и идентификатором пользователя и его именем.
Далее, когда кто-нибудь попытается отредактировать ее снова, вам нужно проверить, заблокирована ли запись в базе данных, и показать какое-нибудь предупреждение вроде:
Пользователь X начал редактировать этот пост в 12:14
И когда пользователь X, наконец, сохраняет форму, вы просто удаляете запись блокировки.
Обратите внимание, что отключить редактирование заблокированной записи может быть непросто, например, когда кто-то откроет запись и пойдет ужинать. В таком случае вы должны справиться с этим, предоставив пользователю ссылку на ручную разблокировку записи (после нажатия на нее вы просто удаляете запись блокировки), или просто отобразите информацию:
Свяжитесь с администратором и попросите его разблокировать запись Y
Конечно, вы можете использовать некоторый AJAX для проверки в фоновом режиме, чтобы проверить, заблокирована ли запись с некоторым интервалом времени (аналогично проверке StackOverflow обновлений записей и комментариев)