Как отключить кнопку НАЗАД в браузере (во всех браузерах)?
Как отключить кнопку НАЗАД в браузере (во всех браузерах)?
Ответы:
Этот вопрос очень похож на этот один ...
Чтобы это работало, вам нужно принудительно истечь срок действия кеша. Поместите следующий код на свою страницу с кодом позади.
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) пользователя / браузера на требуемую страницу.
Было несколько разных реализаций. Существует флэш-решение и несколько решений iframe / frame для IE. Проверить это
Кстати: существует множество веских причин для отключения (или, по крайней мере, предотвращения 1 шага) кнопки «Назад» - посмотрите на gmail в качестве примера, который реализует хеш-решение, обсуждаемое в статье выше.
Погуглите, "как ajax сломал кнопку возврата", и вы найдете множество статей о пользовательском тестировании и обоснованности отключения кнопки возврата.
У меня также была такая же проблема, используйте эту функцию сценария Java в теге заголовка или в, его 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 -> 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>теге страницы входа :
<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();
}
надеюсь, это поможет ... :) кто-нибудь, пожалуйста, научите меня редактировать эту страницу ...
ЕСЛИ вам нужно мягко подавить клавиши удаления и возврата в веб-приложении, чтобы при редактировании / удалении элементов страница не перенаправлялась неожиданно, вы можете использовать этот код:
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 кодекса «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(); });