Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Корректный уход с сайта (https://javascript.ru/forum/events/18802-korrektnyjj-ukhod-s-sajjta.html)

AndreyS 16.07.2011 00:05

Корректный уход с сайта
 
Здравствуйте!

Нужно сделать корректный уход с сайта.
На странице есть ссылка "Выйти", когда юзер её нажимает, то запускается php-скрипт (закрывает сессии, делает запись в БД). Но юзер может и не нажать ссылку, а просто закрыть страницу или перейти на другой сайт.

Использовал onbeforeunload и confirm(), но работает не правильно...

Не могу понять что в коде написать, по-этому опишу словами.
Юзер нажимает ссылку на внешний какой-нибудь сайт.
запускается моя js-функция:
if (confirm("Покинуть страницу?")) {
          запустить мой php-скрипт;
          осуществить переход по нажатой ссылке; 
        } else {
          блокровать переадресацию по ссылке; // остаться на сайте и не переходить по ссылке
        }


То есть нужно отловить событие ухода и потом написать обработчик.
Видел много раз такое на разных сайтах.

Подскажите пожалуйста, я вывел диалоговое окно, как написать обработчик для кнопок ???

trikadin 16.07.2011 00:14

<script>
window.onunload= function() {
 alert("До свидания!");
};
</script>
<a href="http://yandex.ru">Нажмите на ссылку, чтобы понять</a>

AndreyS 16.07.2011 14:48

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

Например, в том же "контакте" при нажатии на внешнюю ссылку появляется окно, где можно выбрать перейти по ссылке или остаться на странице.
Вот что то подобное мне и надо.

walik 16.07.2011 14:56

AndreyS,
Не тупи, trikadin показал на какое событие нужно вешать confirm.

AndreyS 16.07.2011 18:26

Сделал confirm.
При нажатии на какую-нибудь ссылку появляется окно, НО если я жму отмена то все равно происходит переход по ссылки, а нужно чтоб осталось на той же странице.
То есть жму Ок или Отмена результат одинаковый - переход по нажатой ссылке.

trikadin 16.07.2011 19:16

<script>
window.onbeforeunload= function() {
 return "Вы точно хотите уйти?";
};
</script>
<a href="http://yandex.ru">Нажмите на ссылку, чтобы понять</a>

AndreyS 16.07.2011 19:39

О спасибо большое!!!
А можно, например, если нажать кнопку "Уйти" со страницы" выполнить еще один скрипт мой, а потом сделать переход по ссылке?

trikadin 16.07.2011 19:47

Цитата:

Сообщение от AndreyS
А можно, например, если нажать кнопку "Уйти" со страницы" выполнить еще один скрипт мой, а потом сделать переход по ссылке?

Кто, собственно, мешает попробовать?

AndreyS 17.07.2011 17:13

Подскажите пожалуйста это вообще возможно, запустить свой скрипт по нажатию кнопки в данном окне.
Весь интернет облазил ничего не нашел.
Только вставляю условие сразу перестает работать.

Как обработать нажатие кнопок???

trikadin 17.07.2011 17:19

document.onkeydown=function() {alert("Вы нажали кнопку!")};


А, тут не сработает.

AndreyS 17.07.2011 19:03

Так это нажатие клавиатуры...

Появляется окно с вопросом "Покинуть страницу?", если юзер жмет "Покинуть", при закрытии страницы выполнить скрипт.
Нужно поймать кнопку "Покинуть", и написать ей обработчик.

Вот как к именно этой кнопке обратиться?

Gozar 17.07.2011 21:53

AndreyS,
Зачем насиловать пользователей, представь что при нажатии пульта телевизора он начнет тебя спрашивать уверен ли ты или реклама поинтересуется в себе ли ты?

AndreyS 18.07.2011 00:02

Дело в том что это интернет чат.


Когда человек заходит в чат, в БД ставится флаг что он online.
В главном окне есть список "Пользователи online".

Проблема в том что человек может просто закрыть страницу или перейти на другой сайт.

Как это отловить и убрать его из online???

Подскажите пожалуйста может есть какой-нибудь другой способ это сделать!! А то я уже не знаю что делать...

trikadin 18.07.2011 00:07

Например: каждые n секунд браузер посылает на сервер сообщение. Типа "Я онлайн!". Если в течении n секунд на сервер сообщение не приходит - то делаешь пользователя оффлайн.

P. S. Не уверен, что это лучший способ)

AndreyS 18.07.2011 00:32

А можно пожалуйста по подробнее.

Как браузер посылает это сообщение?
Хотя бы на словах, а то не совсем понял как это должно происходить.

trikadin 18.07.2011 00:37

Аякс...

А можно поподробнее, как вы чат без аякса пишете?

kobezzza 18.07.2011 00:43

Цитата:

А можно поподробнее, как вы чат без аякса пишете?
Ну ну почему, всё можно) Раньше большинство чатов были на фреймах, где просто был статичный рефреш странички. Да и до появления AJAX люди его эмулировали. У меня есть здоровенная книга Томаса Паула "AJAX" и там целая часть посвящена тому, как раньше люди делали - куча способов и каждый оригинальней и чуднее другого)

К примеру, запрашиваем у сервера картинку с помощью img, а на самом деле кидаем ему запрос, а он ответом генерит прозрачную картинку и по её высоте мы определяем, что он нам сказал :D

AndreyS 18.07.2011 01:18

У меня есть небольшая часть c Ajax.
Не понятна сама идея. Как браузер может знать Online или нет.

Сейчас значение "online" у меня хранится в БД. Мой блок обновляется каждые 5 сек. и шлет запрос к БД.
А как браузер может сам определять это не понятно.

kobezzza 18.07.2011 01:26

Ну самый простой вариант - это polling: раз скажем в 5 минут посылаешь запрос серву, мол "привет, я всё ещё онлайн". Если делать понтовей, то можно сделать сокет.

trikadin 18.07.2011 01:29

Цитата:

Сообщение от AndreyS
Как браузер может знать Online или нет.

Всё просто. Если ты на странице - браузер шлёт запросы. Если ты не на странице - то нет. Утрированный пример:

setInterval(function(){alert("Ты тут!")}, 5000);

Цитата:

Сообщение от kobezzza
К примеру, запрашиваем у сервера картинку с помощью img, а на самом деле кидаем ему запрос, а он ответом генерит прозрачную картинку и по её высоте мы определяем, что он нам сказал

Это офигенно. Это круто.

AndreyS 18.07.2011 01:48

А если пользователь не ушел, а просто открыл еще одну вкладку и параллельно на другом сайте сидит.
Корректно будет работать?

kobezzza 18.07.2011 01:51

Да

trikadin 18.07.2011 01:51

Цитата:

Сообщение от AndreyS
А если пользователь не ушел

А если пользователь не ушёл, зачем его оффлайн делать?

AndreyS 18.07.2011 02:03

Я так понял что бы что то передать на сервер нужно через Ajax?

trikadin 18.07.2011 02:06

Да.

AndreyS 18.07.2011 02:20

Написал Ajax-запрос.

Теперь каждые 5 сек. отправляется на сервер переменная "On=1".
А на сервере как сделать?
Фиксировать время когда поступает переменная и сравнивать или можно как-то проще?

kobezzza 18.07.2011 02:24

Цитата:

Теперь каждые 5 сек
Отчаянный парень ты) сделал DDOS своему серверу)

trikadin 18.07.2011 02:32

Цитата:

Сообщение от kobezzza
Отчаянный парень ты) сделал DDOS своему серверу)

kobezzza, другой вариант в студию. Я же говорил, что он не самый лучший... А вообще... DDOS... У него же не тысячи посетителей. А 5 сек - не так уж часто. Сообщения в чате иногда чаще отправляются.

AndreyS 18.07.2011 02:34

Не подумал...) людей все равно пока нет, потом увеличу, просто тестирую ждать не хочется пока скрипт отработает.

Так, а что на сервере делать, тоже по таймеру?

kobezzza 18.07.2011 02:42

Цитата:

kobezzza, другой вариант в студию.
Ну как вариант не 5 сек, а чуть по дольше)

Да и я писал выше, что понтовей сделать на сокете (например через flash), тогда задержек не будет)

На сервере можно отдельный процесс создать, а вообще я не силён в данном вопросе, там кто заморачивается с Node.JS/phpDaemon/Twisted и т.д. могут более конкретно сказать

trikadin 18.07.2011 02:44

Не обязательно по таймеру. В момент, когда нужно знать, онлайн пользователь или оффлайн - просто берёте время последнего оповещения об онлайновости и сравниваете его с текущим. Если больше, скажем, 7 секунд - чувак оффлайн. 2 секунды на издержки)

А, чёрт, я понял о чём говорил kobezzza! Туплю, да. Короче, суть в том, что если есть злоумышленник, хоть чуток разбирающийся в web-технологиях, он может поставить время на таймер на 0 мс, и тогда ваш сервер может упасть. Особенно если окон открыть несколько.

UPD: А, то есть kobezzza говорил всё-таки не об этом...

trikadin 18.07.2011 02:48

Кстати да... Смотрите в сторону NodeJS. Тут mycoding делал где-то...

kobezzza 18.07.2011 02:48

Цитата:

UPD: А, то есть kobezzza говорил всё-таки не об этом...
Чёрт, я тоже об этом и не подумал, но да ты прав:yes:

Цитата:

Кстати да... Смотрите в сторону NodeJS. Тут mycoding делал где-то...
Ну я бы не советовал NodeJS, ибо насколько мне известно до сих пор нету нормальных хостов под него, можно взять другую реализацию, например phpDaemon, одна хрень, что и NodeJS только на php

http://habrahabr.ru/blogs/php/79377/

trikadin 18.07.2011 02:52

Но с другой стороны, если мы тут сейчас ещё и на ошибки безопасности начнём заморачиваться, то мы тут зазимуем)

AndreyS 18.07.2011 02:54

С серверной частью все понял, спасибо.

А как с Ajax быть, я только сейчас подумал о перегрузке у меня еще два окна параллельно обновляются. Как не допустить подмены числа. Может на сервере как то проверять эти числа?

trikadin 18.07.2011 02:56

Цитата:

Сообщение от AndreyS
Может на сервере как то проверять эти числа?

Какие числа?

AndreyS 18.07.2011 02:59

секунды. Чтоб 0 сек. не смогли поставить
Я уже что то запутался...

kobezzza 18.07.2011 02:59

AndreyS обрати внимание на ссылку, что я скинул, там люди как раз сделали чат в связке с phpDaemon и исходники там есть

Цитата:

секунды. Чтоб 0 сек. не смогли поставить
Я уже что то запутался...
На сервере смотришь, если запросы от одного ИП слишком часто идут - баниш его

AndreyS 18.07.2011 03:08

Посмотрел.
Кто то пользовался этим, сложно или нет?
Недавно начал php фреймворками не пользовался еще, пока хватало.
Получается переделывать все придется(

AndreyS 18.07.2011 03:10

Пример чата из статья поклацал не понял как он работает, там только цифры внизу меняются и все


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