Отключить кнопку возврата браузера - PullRequest
95 голосов
/ 07 июня 2009

Как отключить кнопку BACK браузера (в разных браузерах)?

Ответы [ 20 ]

59 голосов
/ 07 июня 2009

Не отключать ожидаемое поведение браузера.

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

46 голосов
/ 04 мая 2011

Я придумал небольшой взлом, который отключает кнопку возврата с помощью 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 the back button!
</body>
</html>

Что он делает?

Из комментариев:

Этот сценарий использует тот факт, что браузеры считают, что все, что идет после знака "#" в URL, является частью истории просмотра. Это происходит следующим образом: при загрузке страницы к URL добавляется «# 1». Через 50 мс "1" удаляется. Когда пользователь нажимает «назад», браузер изменяет URL-адрес обратно на тот, который был до удаления «1», НО - это та же самая веб-страница, поэтому браузеру не нужно перезагрузить страницу. - Йосси Шашо

34 голосов
/ 07 июня 2009

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

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

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

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

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

24 голосов
/ 07 июня 2009

Этот вопрос очень похож на этот один ...

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

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
10 голосов
/ 27 декабря 2011

Пока я ищу ответ сам, «Лучшая практика» ... устарела ... Так же, как браузеры. (Действительно, браузеры - это ужасные окаменелости)

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

Почему? Потому что для моего текущего проекта я создаю 100% -ый JavaScript-интерфейс, созданный и контролируемый. И кнопки «Назад» в моем проекте нет места, так как нет смены страницы. (Т.е. чертовски быстро и без обновления страницы из-за обновления .. Как в реальном приложении!)

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

Но браузеры - это браузеры ... Я не ожидаю, что в этом отношении произойдет что-то интересное.

4 голосов
/ 01 июля 2011

Я искал тот же вопрос и нашел следующий код на сайте. Мысль поделиться этим здесь:

function noBack()
{
   window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }

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

2 голосов
/ 26 апреля 2014

У меня тоже была такая же проблема, использование этой функции Java-скрипта в заголовке тега или в ней, 100% работало нормально, не позволило бы вам вернуться.

 <script type = "text/javascript" >
      function preventBack(){window.history.forward();}
        setTimeout("preventBack()", 0);
        window.onunload=function(){null};
    </script>
2 голосов
/ 08 июня 2009

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

Полагаю, вы можете сделать это только путем отслеживания сеанса пользователя на стороне сервера и перенаправления (как в Server.Transfer, а не Response.Redirect) пользователя / браузера на нужную страницу.

2 голосов
/ 11 января 2011

Было несколько разных реализаций. Существует флэш-решение и некоторые решения iframe / frame для IE. Проверьте это

http://www.contentwithstyle.co.uk/content/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps

Кстати: существует множество веских причин отключить (или, по крайней мере, предотвратить 1 шаг) кнопку возврата - посмотрите на gmail как пример, который реализует решение для хэширования, рассмотренное в статье выше.

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

2 голосов
/ 16 ноября 2010
<body onLoad="if(history.length>0)history.go(+1)">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...