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

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

21 ответов


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

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

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)

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

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


Я придумал небольшой хак, который отключает кнопки "назад" с помощью 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-адресе как часть истории просмотра. Что он делает: когда страница загружается," #1 " добавляется к URL-адресу. После 50 мс "1" удаляется. Когда пользователь нажимает "назад", браузер меняет URL - адрес на тот, который был до удаления" 1", но-это та же веб-страница, поэтому браузеру не нужно перезагружать страницу. - Йоси Шашо!--2-->


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

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

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

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

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


осуждение вопроса, не зная контекста, немного сурово. Я, например, хотел бы знать правильный способ сделать это: в настоящее время я запускаю онлайн-эксперимент по психологии, и иногда участники нажимают кнопку "Назад" (backspace или "удалить", когда на mac) вместо клавиши enter, случайно. Это потенциально может испортить эксперимент и, таким образом, разрушить данные (что, к счастью, еще не произошло). Это, очевидно, случай, когда вход должен быть ограниченный.

конечно, я согласен, что в правило это очень плохая идея... но это уже достаточно ясно.


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

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

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

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

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


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

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

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


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

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


<body onLoad="if(history.length>0)history.go(+1)">

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

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

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

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


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

 <script type = "text/javascript" >
      function preventBack(){window.history.forward();}
        setTimeout("preventBack()", 0);
        window.onunload=function(){null};
    </script>

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


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


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

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

начальная страница (файл 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>";
    }
?>

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


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

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

<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();
}

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

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

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


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

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);

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

<script type="text/javascript">
    window.onload = function () {
        noBack();
    }
    function noBack() {
        window.history.forward();
    }
</script>
<body  onpageshow="if (event.persisted) noBack();">
</body>

проблема с Йоси Shasho'код заключается в том, что страница прокручивается вверх каждые 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(); });

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

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});

<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>

попробуйте этот код. Работать на меня. Он в основном изменяет хэш, как только загружается страница, которая изменяет страницу недавней истории, добавляя" 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>