Javascript обнаруживает две формы, открытые в одном браузере

#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 обновлений записей и комментариев)