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

98

Как отключить кнопку НАЗАД в браузере (во всех браузерах)?

приянка.саркар
источник
92
Вы не владеете компьютерами своих пользователей или их браузерами.
Instance Hunter
47
+1 Потому что, хотя я согласен с тем, что отключение кнопки «Назад» в браузере - это «плохая практика», я не вижу причин для того, чтобы опускать сам вопрос, отвечать и объяснять, почему это путь, по-моему.
ChristopheD
45
Почему мы настроены враждебно к этому вопросу? Насколько нам известно, человек, задающий этот вопрос, уже знает, что это плохая юзабилити-практика, но он просто выполняет требования или, может быть, просто хочет чему-то научиться. Почему бы нам просто не притвориться, что это гипотетический вопрос, и не ответить, как бы мы это сделали, ЕСЛИ бы нам пришлось поступить так?
thomasrutter 07
5
Некоторые вещи никогда не следует делать, независимо от желания их делать. Наличие необязательного требования для этого сразу говорит о том, что требования были установлены людьми, не имеющими отношения к бизнесу, а это гораздо более серьезная проблема.
annakata
37
тьфу, я написал самый классный комментарий, но потерял его, когда случайно нажал кнопку возврата.
Дэн Уильямс

Ответы:

26

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

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

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
RSolberg
источник
14
Обратите внимание, что создание некэшируемой страницы не приводит к тому, чего хотел OP: отключить посещение страниц с помощью кнопки возврата. Даже если браузер подчиняется запрету кеширования при использовании кнопки «Назад» (какие браузеры не обязаны делать AFAIK), они все равно предоставляют способ перезагрузки этой страницы (обычно после отображения диалогового окна с предупреждением). Так что, если вы действительно не хотите, чтобы ваши пользователи возвращались на эту страницу, это может быть хуже, поскольку запрос этой страницы ДОЛЖЕН пройти весь путь до исходного сервера. Вам понадобится что-то на стороне сервера, чтобы обнаружить, что страница была повторно посещена. Заголовки можно игнорировать.
thomasrutter
60

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

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

Джонатан Фингланд
источник
6
Спасибо, чувак, дело в том, что если вы создаете приложение AJAX, компромисс между отключением кнопки возврата или просмотром вашего приложения и выработкой соответствующего обратного действия для каждого возможного сценария может привести к отключению кнопка «Назад» - более привлекательный вариант из двух.
david.barkhuizen
Я был бы согласен с Джонатаном, особенно с потоком перенаправляющей рекламы вредоносных программ, которая в настоящее время наводняет Интернет, они уже злоупотребляют системой предупреждений, чтобы затруднить уход со своих страниц, не давая им возможности фактически заблокировать вас на своей странице
MikeT,
46

Я придумал небольшой прием, который отключает кнопку «Назад» с помощью 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», НО - это та же веб-страница, поэтому браузеру не нужно перезагружать страницу. - Йоси Шашо

Йоси Шашо
источник
1
Похоже, этот скрипт добавляет "#" к URL-адресу при загрузке страницы, и каждые 50 мс он добавляет 1 к URL-адресу.
ashes999 06
6
Этот сценарий использует тот факт, что браузеры рассматривают все, что идет после знака "#" в URL-адресе, как часть истории просмотров. Что он делает: когда страница загружается, к URL-адресу добавляется "# 1". Через 50 мс цифра «1» удаляется. Когда пользователь щелкает «назад», браузер изменяет URL-адрес обратно на тот, который был до удаления «1», НО - это та же веб-страница, поэтому браузеру не нужно перезагружать страницу.
Йоси Шашо
1
обратите внимание, что URL-адрес изменяется дважды: мы делаем это только для того, чтобы замаскировать реализацию, чтобы никто не увидел, что мы добавили «1». Так что на самом деле, когда пользователь щелкает назад, страница на мгновение повторно добавляет "№1" и снова удаляет его. Кстати, это не обязательно должно быть «1», это может быть любая строка.
Йоси Шашо
2
Проблема в том, что страница прокручивается вверх каждые 50 мс. Если у вас форма больше высоты окна, это сделает невозможным заполнение значений формы.
3komma14
Огромное спасибо. Это очень полезно для моей особенно интерактивной страницы на основе JavaScript, где прокрутка влево и вправо является частью механизма. Это помогает устранить проблему, связанную с жестом прокрутки в Mac OS X, когда пользователи случайно «возвращаются» на страницу (все это легко сделать, если они уже полностью прокручены).
Iain Collins
34

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

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

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

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

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

Thomasrutter
источник
1
Мой банк использует другой подход - он полностью завершает сеанс. Использование кнопки «Назад» эквивалентно выходу из системы.
RobG
Похоже на тот же подход. Они обнаруживают, что вы вернулись и вызвали ошибку.
thomasrutter
Также joomla работает над решением для токена, токен генерируется каждой страницей и каждой формой, на самом деле есть некоторые проблемы с этой практикой, например, «когда пользователь слишком долго остается на странице и его токен истекает»
Маттео Бонони 'peorthyr'
1
Не поймите меня неправильно, с этой практикой связано МНОГО проблем. Я не рекомендую это, я просто говорю, как это обычно достигается. Они передают уникальные токены между страницами, чтобы определить, что вы не перешли по одной из ожидаемых ссылок с предыдущей страницы, а затем завершают сеанс или показывают ошибку. Он ломает кнопку «Назад», нарушает просмотр с вкладками, нарушает создание закладок и / или ссылки для обмена и многое другое - и более того, это не решает никаких проблем.
thomasrutter
Если проблема в том, что информация потеряна или уже ломается, если пользователь пытается использовать кнопку «Назад», то отключение кнопки «Назад» было бы более желательным подходом.
PoloHoleSet
10

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

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

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

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

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

ЗвездныйДьявол
источник
1
100% не согласны, хотя эта функция была бы замечательной для 99% веб-разработчиков, остается 1%, которые злоупотребляют этой функцией, на мой взгляд, слишком опасно позволять веб-сайту контролировать вашу способность использовать Интернет. Скрипт переадресации между доменами требует либо запрета, либо разрешения подтвердить, разрешен ли запуск скрипту именно из-за такого рода злоупотреблений
MikeT
@MikeT - Как отключение кнопки «Назад» во время навигации по страницам моих собственных приложений ограничивает возможности кого-либо использовать Интернет?
PoloHoleSet 09
@PoloHoleSet, если у вас есть возможность отключить кнопку возврата в браузере, то все, что вам нужно, это одно перенаправление, чтобы отправить вас на страницу, на которую вы не хотели переходить, и если они могут отключить элементы управления навигацией в браузере, как ты сбежал? Я уверен, что вы сталкивались со страницей «у вас есть вирусная страница», где они предлагают вам установить их вирус, чтобы удалить несуществующий вирус. Теперь представьте себе этот сайт, с которого они действительно могут помешать вам покинуть этот сайт
MikeT
@MikeT - я могу ввести любой другой URL-адрес в окне навигации, могу закрыть вкладку, могу отключить javascript. Дело не в том, МОЖЕТ ли кто-то, потому что вы можете, я могу, любой может. В соответствии с политикой люди говорят, что вам НЕ СЛЕДУЕТ, если вы можете. Мы не говорим о том, как мы создадим браузер, мы говорим о том, как мы программируем приложение.
PoloHoleSet
@PoloHoleSet, если вы собираетесь заблокировать навигацию, вам нужно заблокировать не только кнопку «Назад», поскольку история браузера и введенные URL-адреса также предоставят пользователям способ обойти ваш рабочий процесс. и, как я уже сказал, мы говорим не о том, что вы или я бы сделали, а о вредоносном элементе, если единственный способ предотвратить захват вредоносным веб-сайтом вашего браузера - это отключить все js в вашем браузере, тогда вы сломали Интернет как современный Интернет полагается на скрипты для предоставления контента, и я хочу
сказать
4

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

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

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

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

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

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

девио
источник
2
<body onLoad="if(history.length>0)history.go(+1)">
Лондон
источник
2

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

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

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

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

ДаллинДайер
источник
Оцените также новую программу просмотра фотографий Facebook. Обратите внимание, что кнопка «Назад» возвращает вам фотографию (а это именно то, что вы хотите) вместо использования браузера по умолчанию
DallinDyer
2

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

 <script type = "text/javascript" >
      function preventBack(){window.history.forward();}
        setTimeout("preventBack()", 0);
        window.onunload=function(){null};
    </script>
Абдул Халик
источник
1

Попробуйте этот код. Работал у меня. Он в основном изменяет хеш, как только загружается страница, которая изменяет недавнюю страницу истории, добавляя «1» в URL. Поэтому, когда вы нажимаете кнопку «Назад», он каждый раз перенаправляется на одну и ту же страницу.

 <script type="text/javascript">
    var storedHash = window.location.hash;
    function changeHashOnLoad() { window.location.hash = "1";}
    window.onhashchange = function () {
        window.location.hash = storedHash;
    }
</script>

<body onload="changeHashOnLoad(); ">

</bod>
П. Шреста
источник
0

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

Епаскарелло
источник
См. Мой комментарий к этому ответу, чтобы узнать, почему это не работает.
thomasrutter
0

Вместо того, чтобы пытаться отключить кнопку возврата в браузере, лучше поддержать ее. .NET 3.5 может очень хорошо обрабатывать кнопки браузера «назад» (и «вперед»). Выполните поиск в Google: "Scriptmanager EnableHistory". Вы можете контролировать, какие действия пользователя будут добавлять запись в историю браузера (ScriptManager -> AddHistoryPoint), и ваше приложение ASP.NET будет получать событие всякий раз, когда пользователь нажимает кнопки браузера «Назад / Вперед». Это будет работать для всех известных браузеров.

Корн
источник
0

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

Вот один из способов предотвратить нежелательную навигацию между страницами:

Верхняя страница (файл top.php):

<?php
    session_start();
    $_SESSION[pid]++;
    echo "top page $_SESSION[pid]";
    echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>

Вторая страница (файл secondary.php):

<?php
    session_start();
    if ($_SESSION[pid] != $_GET[pid]) 
        header("location: top.php");
    else {
        echo "secondary page $_SESSION[pid]";
        echo "<BR><a href='top.php'>top</a>";
    }
?>

Эффект состоит в том, чтобы разрешить переход с верхней страницы вперед на дополнительную страницу и назад (например, «Отмена») с использованием ваших собственных ссылок. Но после возврата на главную страницу кнопка возврата браузера не может перейти на дополнительную страницу.

Anono Mouser
источник
0

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

в <head>теге страницы входа :

<script type="text/javascript">
    window.history.forward();
</script>

в кнопке выхода из системы я сделал это:

protected void Btn_Logout_Click(object sender, EventArgs e)      
{
    connObj.Close();
    Session.Abandon();
    Session.RemoveAll();
    Session.Clear();
    HttpContext.Current.Session.Abandon();
}

и на странице входа я сосредоточил внимание на текстовом поле Username следующим образом:

protected void Page_Load(object sender, EventArgs e)
{
    _txtUsername.Focus();
}

надеюсь, это поможет ... :) кто-нибудь, пожалуйста, научите меня редактировать эту страницу ...

Робин
источник
a) отредактируйте ответ b) щелкните знак вопроса c) щелкните расширенную справку d) прочтите и примените :-) Также обратите внимание, что ctrl-k un / отступает от выбранного блока, чтобы un / format как код. Плюс форматтер не может хорошо обрабатывать вкладки (хотя, вероятно, здесь не проблема)
kleopatra
0

ЕСЛИ вам нужно мягко подавить клавиши удаления и возврата в веб-приложении, чтобы при редактировании / удалении элементов страница не перенаправлялась неожиданно, вы можете использовать этот код:

window.addEventListener('keydown', function(e) {
  var key = e.keyCode || e.which;
  if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
    var len=window.location.href.length;
    if(window.location.href[len-1]!='#') window.location.href += "#";
  }
},false);
nvd_ai
источник
0

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

<script type="text/javascript">
    window.onload = function () {
        noBack();
    }
    function noBack() {
        window.history.forward();
    }
</script>
<body  onpageshow="if (event.persisted) noBack();">
</body>
Сухайб Джанджуа
источник
0

Проблема с Йосси Shasho кодекса «s является то , что страница прокручивается к началу каждые 50 мс. Итак, я изменил этот код. Теперь он отлично работает во всех современных браузерах, IE8 и выше.

var storedHash = window.location.hash;
function changeHashOnLoad() {
    window.location.href += "#";
    setTimeout("changeHashAgain()", "50");
}

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

function restoreHash() {
    if (window.location.hash != storedHash) {
        window.location.hash = storedHash;
    }
}

if (window.addEventListener) {
    window.addEventListener("hashchange", function () {
        restoreHash();
    }, false);
}
else if (window.attachEvent) {
    window.attachEvent("onhashchange", function () {
        restoreHash();
    });
}
$(window).load(function () { changeHashOnLoad(); });
Вишну Т.С.
источник
0

Похоже, это сработало для нас.

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});
jgabb
источник
0
<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
четан
источник