Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   как засечь повторное открытие страницы? (https://javascript.ru/forum/events/61929-kak-zasech-povtornoe-otkrytie-stranicy.html)

greenwar 16.03.2016 11:59

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

Dilettante_Pro 16.03.2016 12:19

greenwar,
На сервере в php getenv('REMOTE_ADDR'); - дает ip клиента. Но для определения, есть ли дубль, необходимо хранить ip клиентов и как-то определять, закрыт ли предыдущий сеанс

greenwar 16.03.2016 12:32

php тут не поможет, он не умеет с браузером контачить
JS надо, я думал про его window-ы или ещё как-то
чтобы вкладки ловить и проверять, что такое же окно, с таким же идентификатором, не открыто в соседней вкладке

Dilettante_Pro 16.03.2016 12:51

greenwar,
А если я открыл второе окно в другом браузере (у меня установлено 4)

Deff 16.03.2016 13:07

greenwar,
Кидать отрытую ссылку в список в sesionStorage, при открытии новой страницы сверять с массивом уже вписанных ссылок

greenwar 16.03.2016 13:12

Цитата:

Сообщение от Deff (Сообщение 411134)
greenwar,
Кидать отрытую ссылку в список в sesionStorage, при открытии новой страницы сверять с массивом уже вписанных ссылок

ok, а если просто перезагрузит страницу по F5?
как именно зафиксировать факт наличия 2х одновременно открытых?

Deff 16.03.2016 13:19

greenwar,
В хидере или в начале body ставите скрипт проверки наличия и добавки ссылки(если отсутствует) в ячейку (списком, к примеру через запятую, хеши обрубаете) sesionStorage
Хоть по F5, хоть как - скрипт сработает

greenwar 16.03.2016 13:23

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

Deff 16.03.2016 13:30

greenwar,
Тогда вам нужно удаление ссылки из списка при закрытии страницы, по идее и по F5 наверно есть событие onunload предыдущей страницы (ну или нун подумать, пока нет мыслей)

Dilettante_Pro 16.03.2016 13:53

SessionStorage хранит данные для текущего окна. Это значит, что если вы закрыли окно, то все текущие данные, хранящиесе в SessionStorage теряются, даже если у вас открыто несколько окон с данным сайтом

greenwar 16.03.2016 14:07

Цитата:

Сообщение от Dilettante_Pro (Сообщение 411143)
SessionStorage хранит данные для текущего окна. Это значит, что если вы закрыли окно, то все текущие данные, хранящиесе в SessionStorage теряются, даже если у вас открыто несколько окон с данным сайтом

okk, а залезть из одного таба в sessionstorage другого получится?

Dilettante_Pro 16.03.2016 14:10

<!DOCTYPE html>
<html>
<head>
<script>

var item = sessionStorage.getItem('key');
alert(item);

sessionStorage.setItem('key', 'value');

</script>
</head>
<body>

</body>
</html>

Попробуйте запустить эту программку, потом обновить страницу - выдаст value. Запустите в новой вкладке - выдаст null

localStorage хранит лучше, но и не очищает при выходе

greenwar 16.03.2016 15:21

так мне в новой вкладке то нужен value как раз, который определяется по уже открытой вкладке

Dilettante_Pro 16.03.2016 16:05

Цитата:

Сообщение от greenwar (Сообщение 411153)
так мне в новой вкладке то нужен value как раз, который определяется по уже открытой вкладке

Нужен-то нужен, а будет null

Deff 16.03.2016 18:01

Dilettante_Pro,
sessionStorage хранит данные пока открыта хоть одна вкладка с текущего домена

Dilettante_Pro 16.03.2016 18:25

Deff,
Попробуйте программку из поста 12

Deff 16.03.2016 21:23

Dilettante_Pro,
Не тупите, речь идёт о двух(или более) одновременно открытых вкладках
Одну закройте - на второй останется.
А если закрыть обе - нам после этого и значения не надо, будет всё по новой

Dilettante_Pro 16.03.2016 21:53

Deff,
Прочтите внимательно пост 12 и подумайте. На второй вкладке value из первой недоступно - для второй первой вкладки как бы нет

greenwar 16.03.2016 22:00

Цитата:

Сообщение от Deff (Сообщение 411187)
Dilettante_Pro,
Не тупите, речь идёт о двух(или более) одновременно открытых вкладках
Одну закройте - на второй останется.
А если закрыть обе - нам после этого и значения не надо, будет всё по новой

во второй вкладке нельзя получить значение из sessionStorage первой вкладки, потому что оно доступно только в своей вкладке
из localStorage можно, но localStorage живёт вечно и не обнуляется, а значит будет фейлить по F5 тому же
так то можно было бы скомбинировать, что если localStorage === value && sessionStorage === value, значит это F5
но тогда будет фейлить при самом первом открытии окна

Dilettante_Pro 16.03.2016 22:10

greenwar,
Не понял, что дает их комбинация? Какие выводы можно сделать на основе их сочетаний? Если sessionStorage только свой, то он вообще не нужен, а localStorage не умирает

Vlasenko Fedor 16.03.2016 22:11

localStorage без проблем изменяем значение и подписываемся на событие изменения значения
также можно решить с помощью workers

Dilettante_Pro 16.03.2016 22:14

Poznakomlus,
Проблема в том, чтобы он изменился при закрытии сессии

Dilettante_Pro 16.03.2016 22:30

Единственный выход - отключить на браузере все управляющие кнопки и завершать сессию кнопкой на странице с изменением localStorage. Но и при этом можно просто выключить компьютер...

greenwar 16.03.2016 22:39

я надеялся, что окну можно присвоить свой ID, как когда target='uniq_id', например
а потом просто смотреть в любой другой вкладке - не заряжен ли он

в общем-то главное - определить, что такая страница уже открыта в соседней вкладке

Vlasenko Fedor 16.03.2016 23:50

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="storage.js"></script>
<script>
    var key = _storage('key');
    _storage('key', !key);
    _storage().subscribe('key', function (value, e) {
        if(value){
            _storage('key', !value);
        }else{
            alert('Страница уже открыта');
        }
    });
</script>
</body>
</html>

Скрипт для работы с localStorage и парочка хороших примеров
откройте копии страниц в броузере

greenwar 17.03.2016 00:02

ух ты, работает )
вроде даже без нареканий
спасибо!

Deff 17.03.2016 04:11

Dilettante_Pro,
Для особо тугодумных, Запустите первое окна, затем второе(Что Вы видите ?
<script type="text/javascript">sessionStorage[1]=11111111;</script>


<script type="text/javascript">alert(sessionStorage["1"])</script>


C Одного домена sessionStorage читается на всех вкладках, пока хоть одна открыта

Dilettante_Pro 17.03.2016 07:36

Цитата:

Сообщение от Deff (Сообщение 411211)
Dilettante_Pro,
Для особо тугодумных, Запустите первое окна, затем второе(Что Вы видите ?
<script type="text/javascript">sessionStorage[1]=11111111;</script>


<script type="text/javascript">alert(sessionStorage["1"])</script>


C Одного домена sessionStorage читается на всех вкладках, пока хоть одна открыта

По вашему совету запустил первый пример, затем второй. Увидел единички. Не закрывая первой вкладки, открыл вторую и запустил второй пример. Увидел undefined. Может, стоит думать помедленнее?

Dilettante_Pro 17.03.2016 10:41

Цитата:

Сообщение от greenwar (Сообщение 411207)
ух ты, работает )
вроде даже без нареканий
спасибо!

greenwar,
А что именно работает?
У меня пример Poznakomlus не хотел почему-то работать - выдавал Unexpected token на строку 119 storage.js : JSON.parse(value);
Заменил в примере ключевое слово key на name - и все заработало, действительно, вроде четко отслеживает - в Chrome.
В IE проблемы
В Firefox срабатывает несколько странно. Firefox и Chrome друг друга не видят.

greenwar 17.03.2016 11:33

Цитата:

Сообщение от Dilettante_Pro (Сообщение 411216)
greenwar,
А что именно работает?
У меня пример Poznakomlus не хотел почему-то работать - выдавал Unexpected token на строку 119 storage.js : JSON.parse(value);
Заменил в примере ключевое слово key на name - и все заработало, действительно, вроде четко отслеживает - в Chrome.
В IE проблемы
В Firefox срабатывает несколько странно. Firefox и Chrome друг друга не видят.

у меня ошибок не выдаёт, просто работает
открываешь вторую вкладку - кричит
F5 - кричит
короче реагирует на дубль и ни на что другое, что и требовалось
(смотрю в FF и хроме)

вкладки в разных браузерах пофигу, изначально то в одном будут открывать
мне надо просто уведомление ставить, а не хаки обламывать )

Dilettante_Pro 17.03.2016 11:52

greenwar,
F5 - кричит только при открытой второй вкладке(как и надо - обновление - не дубль)
FF сам по себе отрабатывает нормально, но при открытом Chrome начинаются странности.
IE после первого запуска теперь постоянно твердит об открытой странице.
Opera - нормально

Dilettante_Pro 17.03.2016 12:02

Poznakomlus,
greenwar,
Насчет проблемы с IE:
window.addEventListener("storage", handle_storage, false);
Функция обратного вызова handle_storage будет вызвана с объектом StorageEvent, за исключением Internet Explorer, где события хранятся в window.event.

function handle_storage(e) {
if (!e) { e = window.event; }
}
источник - http://htmlbook.ru/html5/storage

greenwar 17.03.2016 12:24

я так понимаю, это Poznakomlus надо в свою библиотеку добавить?

Vlasenko Fedor 17.03.2016 21:47

Пофиксил.
localstorage
Pабота с localstorage, подписка на события localstorage, хранение функций, массивов и объектов в localstorage

Dilettante_Pro 17.03.2016 22:01

Poznakomlus,
А вообще красивая технология - связь между окнами через событие storage! Респект!


Часовой пояс GMT +3, время: 18:18.