Там какой-либо путь состоит в том, чтобы проверить, что моя страница не открыта на другой вкладке или окне в IE? Скажите, что у меня есть Page1 и пользовательские хиты "новое окно", которое откроет новое окно с той же открытой страницей. Таким образом, теперь существует два экземпляра страницы. Я хочу ограничить браузер, чтобы только иметь один экземпляр страницы, открытой в любой момент времени.
Одно из требований - то, что пользователи должны смочь обновить страницу и все еще быть в том же состоянии в приложении. Таким образом, одноразовые маркеры не подходят.
Не уверенный, что существует любой способ различать обновление страницы и новое открытое окно, вот почему я спрашиваю.
P.S. Это не для нормального веб-сайта, и я понимаю, что выполнение этого обычно было бы навязчивым и злым. Существуют веские доводы, чтобы сделать это здесь, как это - крупное веб-приложение.
Лучший способ реализовать это - иметь токен на стороне сервера (многие банки делают это), который генерируется при каждом запросе и должен быть передан обратно для функционирования страниц.
Итак, в основном:
Простой способ сделать это - использовать windowName
window.open(windowURL, windowName, windowFeatures);
, присвоить ему какое-то уникальное свойство и проверять его при нажатии на ссылку, чтобы убедиться, что это не было уже открыт.
этот парень очень хорошо это объясняет. - http://www.joemarini.com/tutorials/tutorialpages/window1.php
Единственный способ, который я могу придумать, - это создать для каждой страницы файл cookie, идентифицирующий страницу и время ее доступа, со сроком действия всего несколько секунды или минуты (настройте по вкусу) и при загрузке вашего сайта (или при загрузке страницы), проверяя, существует ли этот файл cookie.
Псевдокод:
if (cookie exists) {
Page already loaded in another tab/window.
}
else {
write cookie
}
Возможно, вы можете использовать некоторую форму идентификатора сеанса, основанную на чем-то неуникальном. Возможно, с IP-адресом пользователя, именем пользователя и солью? Обратной стороной использования одного IP-адреса является то, что все пользователи за маршрутизатором совместно используют один и тот же адрес, преимущество связывания его с именем пользователя заключается в том, что он по крайней мере уникален для каждого пользователя, а соль используется для базовой безопасности (это может быть не совсем так. важно для вас, но это все еще кажется хорошей практикой), и предотвращает блокировку пользователя, потому что у него где-то «открыто другое окно».
Как и выше, проверьте, существует ли идентификатор сеанса, и, если нет, создайте его.
Как отметил @Spender, в комментариях к вашему вопросу и другому ответу, любое решение, реализующее это, имеет по крайней мере одну проблему, заключающуюся в том, что людям не разрешено обновлять страницу. Которое короткое время cookie, по крайней мере, смягчает, но не настолько, чтобы не мешать пользователям, вероятно, раздражаться.
Чтобы справиться с необходимостью обновления страницы, я думаю, вы могли бы использовать onUnload
(или jQuery .unload
) для уничтожения файла cookie, чтобы он удаляется для пользователя, покидающего / обновляющего страницу.
js, который запускает onUnload
, может также использоваться для удаления переменной сеанса с помощью Ajax или просто cookie на стороне клиента.