LINUX.ORG.RU

Как по-нормальному обрабатывать ситуацию, когда юзер жмёт «назад» и тыкает куда не положено?

 


0

1

Представьте себе форум. Модератор заходит в тему и нажимает «удалить». Его перенаправляет в следующую тему (ну или ещё куда-то). Он нажимает «назад» и опять жмёт «удалить». Форум выкидывает ошибку (тема-то уже удалена). Как принято бороться с такой ситуацией?

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

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

3. Попытаться понять, зачем юзер жмёт назад и спроектировать интерфейс так, чтобы он не хотел жать «назад».

Собственно ошибка вылетает потому, что тема меняет статус и идут проверки на то, что она его меняет как положено (например у неё могут быть другие статусы из которых её удалять запрещено). В реальности это не форум, но принцип тот же, есть сущность у которой юзер меняет статус и потом пытается делать это ещё раз.

★★★★★

В чем проблема то показать какое-то уведомление а-ля «сущность в другом статусе, обновите страницу»? Я периодически работаю в системах, которые не дружат с кнопкой «назад», и мне всегда казалось что это задорукие интерпрайз-индусы такое пишут, а тут смотри ка, и у «наших» это популярно.

micronekodesu ★★★
()

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

Это лучший вариант из предложенных

anonymous
()

Давай начнем с простого вопроса - почему нажав «назад» пользователь попал в удаленную тему? Может проблема со слишком агрессивным кэшированием?

Deleted
()
Ответ на: комментарий от Deleted

так в хроме поди жульничают с кешем, дабы «ускорить» и так будет получаться, или я ошибаюсь?

AndreyKl ★★★★★
()
Ответ на: комментарий от Deleted

Давай начнем с простого вопроса - почему нажав «назад» пользователь попал в удаленную тему? Может проблема со слишком агрессивным кэшированием?

Потому, что браузер так работает. Он сохраняет образ страницы где-то у себя в памяти и при нажатии кнопки «назад» заменяет текущую страницу этим образом. Ты можешь это увидеть на 99% сайтов.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)

по теме - а АПИ не позволяет заменять историю?

ну и есть window.location.replace кажется, т.е. если редиректить реплейсом, то назад будет кидать тебя на предыдущую страницу от темы, а тема как бы исчезнет из истории. или я уже совсем забываю кто на чём стоит?

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это лучший вариант из предложенных

Лучший но, к сожалению, самый геморройный, придётся во все обработчики дописывать соответствующий код. Хотелось бы в одном месте решить этот вопрос.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Это правда только отчасти, жс по кнопке назад будет отрабатывать онлоад, а значит можно перезапросить статус с сервака. Я в свое время так делал.

anonymous
()

Его перенаправляет

вот с этого места уже все не правильно- это называется пытаться влезть и взять на себя решение (ответственность) за юзера

anonymous
()
Ответ на: комментарий от anonymous

Ну я и написал это под пунктом 1. Статус я перезапрашивать вряд ли буду, это не SPA, жаваскрипт тут только для несущественных мелочей, скорее просто всю страницу перезагружу.

Legioner ★★★★★
() автор топика

есть решение лучше.

тебе нужна некая «метка времени» на сервере. она может быть не глобальной, а даже иерархической. например есть форум, а в нем подфорумы.

отдавая сведения о своем состоянии, сервер одновременно говорит, на какой момент эти сведения были валидны для данного клиента. а у себя запоминает последнюю отданую юзеру метку.

если клиент откатил страницу, он придет со старой меткой времени. и его новый запрос сервер сравнит с нужной меткой и ответит либо нормлаьным ответом, либо скажет: бро, что-то пошло не так, перекачай данные заново. дальше можно показать диалог «ой, мы рассинхронизировались» и обновить страницу заново.

ckotinko ☆☆☆
()
Ответ на: комментарий от Legioner

Способы есть. AJAX например, если сложно - предоставить список возможных действий: переход, обновить и т.д. или кастомная обработка хистори.

https://ru.wikipedia.org/wiki/Философия_UNIX для вдохновения

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

anonymous
()

сохранять текущее время в куках, если запрос пришёл из прошлого 301 редирект на актуальную страницу

Deleted
()

Это проблема юзера. Лучше не удалять совсем, а просто за место удаления отдавать страницу, что тема удалена.

anonymous_sama ★★★★★
()

А ты вообще по какой спецификации разрабатываешь?

Самочисто ХТМЛ?

Если по спецификации EJB - могу подсказать.

Serg_HIS
()

Писать тема уже удалена. Тоесть обрабатывать на сервере.
Кстати на лоре с этим проблемы. Если я уже вышел потом нажимаю назад и опять жму выйти, то выползает null.

tyamur ★★
()
Ответ на: комментарий от Legioner

Разве этот обработчик нельзя вынести в отдельную функцию или что-то вроде этого?

anonymous
()
Ответ на: комментарий от ckotinko

Ты бы проверился на шизофрению.

anonymous
()
Ответ на: комментарий от anonymous_sama

Это проблема юзера

У хороших кодеров у юзера нет проблем, они есть только у программы.

anonymous
()

А почему нельзя просто выводить текст ошибки вида «тема уже удалена/статус уже изменен», как это, наверное, сделано сейчас? Также можно вывести содержимое темы (или что там у вас) с этим текстом и отсутствующей кнопкой, которая меняет статус.

Leupold_cat ★★★★★
()
Последнее исправление: Leupold_cat (всего исправлений: 2)

Даже кнопку «назад» не надо придумывать, если этот модератор не единственный может удалять темы.

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

anonymous
()

Проблема надуманная. Ресурс удалён, отдаешь ошибку. Как будто его и не было.

neversleep ★★
()

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

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

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

Скажи, вот с этим что не так? Как по-нормальному обрабатывать ситуацию, когда юзер жмёт «назад» и тыкает куда не положено? (комментарий)

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Lynx поддерживает? Защита от дурака лишней не быапет. Понятно, что средний пользователь лучше среднего бойца/матроса, но все же...

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Lynx поддерживает?

Для большинства сайтов использующих яваскрипт, этот вопрос не имеет никакого смысла так как пользователь не сможет пользоваться ими (под линкс). Что за глупый вопрос? Нет, определённо вы поупоролись.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от Shadow

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

Deleted
()
Ответ на: комментарий от Shadow

Да, но всегда есть вариант стремления к «лучшему», в данном случае реальность такова что у нас есть цепочка клиент-сервре-клиент, где сервер всегда имеет одно состояние, а клиенты имеют несколько в силу того что реализация их изначально такова и не зависит от наших желаний, но общее состояние системы централизованно сервером/серверами и определяет всё то что так или иначе должно произойти на клиенте с учётом того что всё что должно произойти должно быть корректным для сервера. Следовательно нам не важно состояние клиента и сохранение общего состояния должно не задаваться исключениям, а задаваться отверганием всего что выходит за рамки обрабатываемых ситуаций. Если на сервере есть база с пустым полем и после поступивших данных от клиента и записи их в базу снова поступают данные то мы их просто обновляем, если обновление не допустимо, например это данные о платеже, то должен быть заложен механизм не обработки исключения, а отсекания изменения на основе какого либо механизма детектирования произведённого действия, причём жёсткие, что бы «исключительные» ситуации не обрабатывались, а попросту игнорировались что будет приводить к общей надёжности системы в целом и упрощении реализации в частности. Одно из решений временные рамки как фундаментальность невозможности передавать сообщения из прошлого (можно конечно, но это не важно, вчера это вчера). Я вот про это.

Deleted
()
Ответ на: комментарий от Shadow

как исключение? темы не существует, покажется 404, как обычно если зашёл куда то и чего то не существует.

просто признай что вы поупоролись.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Я не игнорирую, это подвид варианта 1, правда я не очень понял, как ты предлагаешь это всё делать, если у меня обычная post-форма с button-submit-ом. Переделывать всё на ajax я точно не буду, нафиг он мне не нужен, но в целом идея использовать js понятна, хотя на текущий момент склоняюсь к варианту 2, он от JS не зависит и в целом концептуально правильней, хоть и понадобится анализировать все действия.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

О, теперь стало ясно что у тебя не так как я полагал. Я полагал ты делаешь ajax запрос.

Тогда остаётся хистори апи.
Т.е. ты форму куда посылаешь?
Грамотно посылать на обработчик, который бы редиректил на страницу ответа вроде «всё хорошо, тема удалена». У тебя так?

Перенаправление нужно чтобы рефреш (F5 для краткости) не пугал пользователя вопросом «а правда отправить ещё разок?».

Предлагаю передать на эту страницу id удалённой темы и в скрипте проверить , содержит ли урл предыдущей страницы этот id (я предполагаю что в нормальной ситуации урл страницы с темой содержит её id, если это не так - поправь пжл меня).

Далее, если урл содержит id, то удалить страницу из истории. Если нет - ничего не делать (это значит пользователь обновил страницу ответа).

PS. Аякс запросы, кстати, хороши ещё тем что в твоём случае не нужно было бы делать дополнительных редиректов сервером, потому что f5 не посылает форму повторно, понятное дело.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 3)
Ответ на: комментарий от Legioner

да, по моему варинат 2 - дело вкуса: т.е. кидаешь ты ошибку или молча игнорируешь - это как бы не вопрос, делай как больше подходит по логике. Вопрос то ведь в том что будет если пользователь нажмёт «обновить» или «назад».

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от Legioner

ну и да, про вариант 2:

Он в любом случае нужен по моему. Положим, тему удалил другой модератор, страница не обновилась. Получится что вне зависимости от решения проблемы с кнопкой назад, проблема всё равно существует. Человек нажал кнопку, а темы уже нет.

Я на удаление часто просто отвечаю успешным сообщением или пустым (зависит от ситуации), вне зависимости от того есть такой объект или нет.

AndreyKl ★★★★★
()
2 мая 2018 г.

Задача решилась отсылкой заголовка Cache-Control: no-store. Браузер при этом всегда перезагружает страницу при каждом заходе, включая историю и юзер не видит устаревших версий.

Legioner ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.