Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как выполнить функцию перед закрытием/перезагрузкой страницы (https://javascript.ru/forum/events/55355-kak-vypolnit-funkciyu-pered-zakrytiem-perezagruzkojj-stranicy.html)

Ol'kO 24.04.2015 11:17

Как выполнить функцию перед закрытием/перезагрузкой страницы
 
Здравствуйте. Требуется по умолчанию сохранять в базе данных настройки пользователя, когда он закрывает или обновляет страницу. window.onbeforeunload и unload не срабатывают. То есть onbeforeunload срабатывает, если выводить предупредительное сообщение, а просто молча функцию не выполняет. Есть какие-нибудь методы осуществить желаемое?? Буду очень благодарна за советы.

hfts_rider 24.04.2015 11:48

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

kostyanet 24.04.2015 11:53

Тут нет логики в onbeforeunload и описанной задаче. Юзер останется на странице - и что? Значит не ушел, значит сохраняли в бд зря, он еще поменяет что-то и опять не получится сохранить.

Все, да, сохраняется по событиям, а не в конце как в екзеле.

Делается на самом деле проще. Без аякса-шмаякса через куки. Сохранили в куках - они на клиенте лежат. Перезагружаем страницу - идет запрос к серверу. Сервер берет те же самые куки, проверяет все и сохраняет в бд, затем из бд читает или кеширует что найдено в куках и согласно настроек отдает пагу.

Ol'kO 24.04.2015 11:57

Цитата:

Сообщение от hfts_rider
В таком случае при любом изменении нужно сохранять настройки вне зависимости от перезагрузки или ухода с сайта.

Такой вариант вряд ли подойдет, т.к. сохраняется расположение иконок, которые юзер может перемещать как ему нравится. Иконок много, и каждый раз отправлять ajax запросы на сервер при каждом перемещении как-то не хочется... По интервалу периодически сохранять тоже не подойдет, ведь человек может закрыть окно до того, как произошло очередное сохранение. Может возможно узнать, что пользователь шарит курсором где-то в меню браузера хотя бы:) и тогда произвести сохранение? Как это делается у нехороших сайтов, которые когда пытаешься их закрыть или уйти со страницы, выводят модальное сообщение при малейшем движении курсора.

kostyanet 24.04.2015 12:08

В смысле узнать где руки юзера? не зависли ли пальцы над комбинацией кнопок alt+f4, или вы уверены что нормальный человек никогда мыш из них не выпустит?

Вам дали правильный ответ. Чтобы не гонять аякс по каждому чиху, сохраняете все через json в куказ и все. Сервер сохавает перед выдачей паги в следующей сессии и все будет выглядеть как оставлено.

Ol'kO 24.04.2015 12:08

Цитата:

Сообщение от kostyanet
Делается на самом деле проще. Без аякса-шмаякса через куки. Сохранили в куках - они на клиенте лежат. Перезагружаем страницу - идет запрос к серверу. Сервер берет те же самые куки, проверяет все и сохраняет в бд, затем из бд читает или кеширует что найдено в куках и согласно настроек отдает пагу.

Что-то я про куки не совсем поняла. Если мы не перезагружаем страницу, а закрываем ее и сегодня уже не откроем? Завтра запустим приложение, а кук нет?

kostyanet 24.04.2015 12:10

Аборигены съедят?

Куда они денутся? По кукам деньги зарабатывают, а тут какие-то иконки, блин.

kostyanet 24.04.2015 12:11

Куки могут храниться до 9999 года. Этого достаточно? Ну вот.

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

Ol'kO 24.04.2015 12:15

у куки же есть срок действия? к тому же их можно удалить, нажав на соответствующую кнопку в браузере

kostyanet 24.04.2015 12:17

Срок действия устанавливает разработчик, максимальный - 9999 год. Что касается удаления куков, то у ваших пользователей все равно нет столько извилин чтобы открыть настройки браузера. Но самая мякотка - как они потом залогиняться к вам на сайт удалив куки? Никто их не удаляет, не переживайте. О них даже никто не знает кроме нас с вами.

kostyanet 24.04.2015 12:20

Я бы вам даже посоветовал вообще ничего не сохранять в бд. Попробуйте - увидите что это - лишнее.

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

Вот вы лично давно их удаляли?

Еще есть вариант что юзер зайдет инкогнито. Тогда никаких куков сервер не увидит вообще. Логин будет работать и все что сохранено в бд - будет, а кукотехника - отвалится. Но опять же - кто так вообще сделает?

Ну и главное - тот кто удалит куки - сам дурак.

Ol'kO 24.04.2015 12:21

Цитата:

Сообщение от kostyanet
Что касается удаления куков, то у ваших пользователей все равно нет столько извилин чтобы открыть настройки браузера.

Лол:lol: Это верно. Но зато система авторизации некоторых наших приложений для начала удаляет все куки перед запуском.

Ol'kO 24.04.2015 12:25

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

kostyanet 24.04.2015 12:28

С куками еще есть ограничение по размеру. Если туда еще писать json и юникод - то много не запишешь. На такие случаи есть локальная бд. Про нее кроме нас вообще никто не знает и посмотреть что там не сможет.

kostyanet 24.04.2015 12:30

Ничего тут нельзя сделать. Если страница - документ, то должна быть кнопка Save. Вы не можете ничего сделать толком в период между beforeunload и unload собственно. Это не десктоп. Юзер имеет право закрыть браузер и прекратить все процессы немедленно.

Галюники с этими фичами с некоторых пор наконец-то устранены во всех нормальных браузерах, что способствовало резкому уменьшению числа долбоящеров использовавших эти фичи во вред.

kostyanet 24.04.2015 12:32

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

kostyanet 24.04.2015 12:36

В парадигме веб-страницы как интерфейса БД, нет никакой разницы где эта бд находится в каждый момент времени. Используя запросы вы просто делаете ту самую репликацию - из локальной бд берете данные и сохраняете в серверной, а из серверной отдаете новые данные и сохраняете в локальной.

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

Смехотура в том, что из браузера нельзя нормально работать с файлами - по соображениям безопасности. Поэтому вся работа ведется с namespace в локальной базе данных. КОторая конечно тоже файл, но со своим собственным интерфейсом.

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

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

Ol'kO 24.04.2015 12:50

Понятно... Идея хорошая. Спасибо за ответы!


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