jquery — обнаружение перезагрузки страницы после нажатия кнопки «Назад» в переполнении стека

Я ищу способ определить, когда страница перезагружается после нажатия кнопки «Назад», чтобы я мог выборочно игнорировать ошибки. Позвольте мне объяснить, почему:

Представьте себе страницу, которая отображает некоторые данные, идентифицируемые по идентификатору:

/show/some/data?id=5

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

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

Я полагаю, что один из способов решить эту проблему — прикрепить случайно сгенерированный идентификатор к URL:

/show/some/data?id=5&rnd=<?php print rand(); ?>

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

Однако это потребует изменения многих ссылок в приложении. Я также мог бы использовать javascript / jQuery для изменения всех ссылок на странице с одинаковым эффектом:

$("a").attr('href', function (i, h) {
return h + (h.indexOf('?') != -1 ? "&" : "?") + "rnd=" + Math.random ();
});

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

1

Решение

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

Затем необходимо обновить обработчик ошибок, чтобы дополнительно проверить наличие запрошенного идентификатора страницы в списке удаленных страниц. Таким образом, вам вообще не придется связываться с URL.

Вот пример потока:

  • пользователь запрашивает идентификатор страницы 1
  • приложение проверяет БД, его не существует
  • приложение проверяет сеанс, его нет в списке удаленных страниц
  • отображается сообщение об ошибке, ошибка регистрируется на сервере
  • пользователь запрашивает идентификатор страницы 2
  • приложение проверяет базу данных, она существует, показать страницу пользователю
  • пользователь нажимает кнопку удаления
  • Идентификатор страницы добавляется в список сеансов удаленной страницы, и страница удаляется
  • пользователь возвращается (или вводит URL вручную, это бонусная функция)
  • приложение проверяет БД, id 2 не существует
  • приложение проверяет сессию, id 2 IS в списке удаленных страниц
  • отображается сообщение об ошибке, ошибки не регистрируются

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector