Отключение кнопки Назад в браузере

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

Если я использую ваш сайт, кнопка "Назад" по-прежнему МОЯ. Не связывайся с моим ... ;-)

Shog9 18.09.2008 00:48

Это неправильный вопрос. Что вам следует сделать, так это разработать приложение таким образом, чтобы при повторной отправке информации приложение распознавало ее и действовало соответствующим образом.

reinierpost 14.06.2011 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
2
43 567
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

К сожалению, это невозможно. Однако рассмотрите модель навигации своих приложений. Вы используете модель Post / Redirect / Get PRG? http://en.wikipedia.org/wiki/Post/Redirect/Get?

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

Ничего печального в этом нет.

Joel Coehoorn 18.09.2008 00:48

Действительный пункт. Мне просто грустно. ;)

Scott Hanselman 18.09.2008 01:24

Скотт - Значит, возможность отключения панелей инструментов и контекстного меню специфична для IE? Я видел LOB-приложения, которые полностью блокируют навигацию, но (опять же, к сожалению) они также требуют, чтобы у пользователя был IE.

Beep beep 19.03.2009 01:53

Что ж, некоторые приложения могут запускаться в режиме «киоска», но для этого требуется запуск IE с переключателями командной строки.

Scott Hanselman 29.03.2009 09:15

@Jess: Это одно из тех неудобств, которые хорошие браузеры пытаются исправить, например, всплывающие окна без запроса. По этой причине Firefox получил настройку «Отключить или заменить контекстное меню».

Álvaro González 04.06.2010 13:50

Можно ли задать вопрос для подтверждения до того, как кнопка «Назад» приведет нас на предыдущую страницу? В случае ОК, перейдите к предыдущему пункту, если отмените, оставайтесь на месте

eomeroff 30.03.2012 02:35

1. Создайте код своего веб-приложения, используя только AJAX, вообще не меняйте URL-адрес. 2. Обработайте onbeforeunload, чтобы предупредить, что они собираются покинуть приложение. Это также предотвращает утечку информации в историю браузера (и вы также можете отключить кеширование). Было бы слишком сложно внести это изменение в существующее приложение; этот подход возможен только в том случае, если вы создаете свое приложение таким образом с самого начала.

Sam Watkins 02.06.2015 10:51

Вы не должны.

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

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

Marco Demaio 23.02.2010 15:35

Вы можете разместить данные из каждой формы в окне _NEW. Это отключит кнопку возврата в каждом окне, но без javascript может быть сложно принудительно закрыть старое.

Вот предыдущий пост об этом: Запретить использование кнопки "Назад" (в IE)

ну, система рекомендаций не показывала этого, когда я создавал сообщение :(

Haoest 18.09.2008 01:25

Я настоятельно призываю вас пойти на все, чтобы не сломать кнопку «Назад», это верный способ оттолкнуть ваших пользователей и даже добраться до №1 на 10 главных ошибок веб-дизайна Джейкоба Нейлсена в 1999 году.

Возможно, вы могли бы подумать о том, чтобы задать вопрос: «Как не сломать кнопку возврата для <вставьте свой сценарий сюда>?»

Если ответ Скотта близок к истине, подумайте о переходе на модель PRG. Если это что-то еще, расскажите подробнее и посмотрите, чем мы можем помочь.

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

pcorcoran 18.09.2008 09:09

Для меня это просто гласит: «Он не хотел сломать кнопку возврата, он просто хотел сломать кнопку возврата, чтобы предотвратить ее поломку». : S Можно заставить AJAX / JavaScript и кнопки «Назад» работать нормально, все, что я предлагаю, это тот путь, которым я бы рекомендовал следовать.

Mike Tunnicliffe 18.09.2008 13:10

Лучший вариант - не зависеть от обратных передач для управления потоком, однако, если вы застряли с ним (пока)

вы можете использовать что-то вроде этого:

  Response.Cache.SetCacheability(HttpCacheability.NoCache);
  Response.Cache.SetExpires(Now.AddSeconds(-1));
  Response.Cache.SetNoStore();
  Response.AppendHeader("Pragma", "no-cache");

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

 if (Page.IsPostBack)
 {
        if (pageIsExpired()){
           Response.Redirect("/Some_error_page.htm");
        }
        else {
           var now = Now;
           Session("TimeStamp") = now.ToString();
           ViewState("TimeStamp") = now.ToString();
        }

  private boolean pageIsExpired()
  {
     if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
        return false;

     if (Session("TimeStamp") == ViewState("TimeStamp"))
        return true;

        return false;
  }

Это в некоторой степени решит проблему. Код не проверен - только в качестве примера.

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

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

Я придумал небольшой прием, который отключает кнопку «Назад» с помощью JavaScript. Проверял на chrome 10, firefox 3.6 и IE9:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
     window.location.href += "#";
     setTimeout("changeHashAgain()", "50"); 
}

function changeHashAgain() {
  window.location.href += "1";
}

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);


</script>
</head>
<body onload = "changeHashOnLoad(); ">
Try to hit back!
</body>
</html>

Но это работает - попробуйте.

Yossi Shasho 29.11.2011 16:37

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

Soumya 02.12.2011 21:14

IE9 не позволяет мне прокручивать эту страницу вниз. Прекрасно работает в последних версиях FF, Chrome, Safari. Тем не менее, люди, которые будут использовать мое одностраничное приложение, будут использовать только IE <= 9.

chrism 01.02.2012 09:38

Это не всегда плохо для пользователя, иногда это правильный опыт. например, страница может изменить свое состояние с помощью Ajax, например Gmail. когда пользователь нажимает «назад», пользователь фактически ожидает, что страница вернется к предыдущему государственный, а не вернется к предыдущему страница

Yossi Shasho 12.02.2012 19:58

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

Warren Sergent 27.04.2012 03:13

Он использует привязки HTML для отключения кнопки «Назад», так что, когда пользователь щелкает назад, он фактически переходит к предыдущей привязке. в данном случае «# 1» или «#». если их нет на странице, страница будет прокручена вверх. Это можно исправить с помощью других якорных текстов или с помощью javascript.

Yossi Shasho 15.11.2012 14:33

@YossiS молодец !! .. именно то, что мне нужно.

Nikhar 19.03.2013 11:43

Я смог добиться этого, используя:

 Response.Cache.SetExpires(DateTime.MinValue);
 Response.Cache.SetNoStore();

Когда я использовал Response.Cache.SetCacheability (HttpCacheability.NoCache); это помешало мне скачать офисные файлы.

Это правда, необходимо добавить правильную проверку, чтобы убедиться, что дублирующиеся данные не испортят ситуацию. Однако, как и в моем случае, я не могу полностью контролировать данные, так как после формы я использую сторонний API. Итак, я использовал это

history.go(+1);

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

Найдите ссылку ниже

Отключить функцию кнопки возврата в браузере с помощью JavaScript в asp.net | ASP.Net отключить кнопку браузера назад (с помощью javascript)

http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html

Во всех основных браузерах можно отключить кнопку «Назад». Он просто использует хеш-значения, чтобы полностью отключить кнопку «Назад». Просто поместите эти 5 строк кода на свою страницу

 <script>
window.location.hash = "no-back-button";
window.location.hash = "Again-no-back-button";//for google chrome
window.onhashchange=function(){window.location.hash = "no-back-button";}
</script> 

Подробное описание

Хитрый..но работает ...

Mayank Pathak 23.08.2013 14:25

@Ankit: Великолепно! Спас мою жизнь! Спасибо!!!

Emma 06.03.2014 17:31

не во всех случаях корректно работает, а именно хром, сафари.

Shaun Wilson 15.09.2014 13:19

Пожалуйста, не делай этого! Это действительно раздражает, если страницы не справляются с основными функциями браузера.

Mira Weller 22.12.2016 22:51

Я полностью понимаю, что просто ответил на заданный вопрос, это зависит от читателя, хорошо это или нет.

bugwheels94 23.12.2016 08:27

Другие вопросы по теме