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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Полагаю, вы можете сделать это только путем отслеживания сеанса пользователя на стороне сервера и перенаправления (как в Server.Transfer, а не Response.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

КСТАТИ: Есть много веских причин чтобы отключить (или, по крайней мере, предотвратить 1 шаг) кнопку «назад» — посмотрите на gmail как на пример, который реализует решение хэширования, рассмотренное в предыдущей статье.

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

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

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

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

Вместо того, чтобы пытаться отключить кнопку возврата браузера, лучше ее поддержать. NET 3.5 может очень хорошо обрабатывать кнопки браузера назад (и вперед). Поиск с помощью Google: «Scriptmanager EnableHistory». Вы можете контролировать, какие действия пользователя будут добавлять запись в историю браузера (ScriptManager — & Gt ; 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>";
    }
?>

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

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

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

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

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

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

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

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>

должен быть установлен в Код Йосси Шашо Код заключается в том, что страница прокручивается до вершины каждые 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>