Ответ 1
Этот вопрос очень похож на этот один...
Для этого вам нужно заставить истечение срока действия кеша работать. Поместите следующий код на свой код страницы.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Как отключить кнопку 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>
Что он делает?
От комментариев:
Этот script использует тот факт, что браузеры рассматривают все, что приходит после знака "#" в URL-адресе, как часть истории просмотра. Что он делает, так это: когда страница загружается, к URL-адресу добавляется "# 1". Через 50 мс "1" удаляется. Когда пользователь нажимает "назад", браузер изменяет URL-адрес обратно до того, что он был до удаления "1", НО - это одна и та же веб-страница, поэтому браузеру не нужно перезагружать страницу. - Йосси Шашо
Вы не можете отключить кнопку "Назад" в пользовательском браузере, но вы можете сделать это так, чтобы ваше приложение ломалось (отображает сообщение об ошибке, требующее от пользователя начать работу), если пользователь вернется.
Один из подходов, который я видел для этого, - это передать токен на каждый URL-адрес приложения и внутри каждой формы. Маркер регенерируется на каждой странице, и как только пользователь загружает новую страницу, токены с предыдущих страниц становятся недействительными.
Когда пользователь загружает страницу, страница будет показывать только, был ли передан правильный токен (который был предоставлен всем ссылкам/формам на предыдущей странице).
Приложение онлайн-банкинга, предоставляемое моим банком, выглядит следующим образом. Если вы вообще используете кнопку "Назад", больше ссылок не будет работать, и больше не будет загружаться страница - вместо этого вы увидите уведомление о том, что вы не можете вернуться назад, и вам нужно начать все сначала.
Осуждение вопроса, не зная контекста, немного суровое. Например, я хотел бы знать правильный способ сделать это: в настоящее время я запускаю онлайн-эксперимент по психологии, а иногда участники нажимают кнопку "Назад" (backspace или "delete", когда на Mac) вместо клавиши ввода, случайно. Это может потенциально испортить эксперимент и, таким образом, испортить данные (чего, к счастью, еще не произошло). Это, очевидно, случай, когда ввод необходимо ограничивать.
Конечно, я согласен с тем, что в правиле это очень плохая идея... но это уже было сделано ясно уже.
Пока я сам ищу ответ, "Лучшая практика" - это... устаревшая... Так же, как и браузеры (действительно, браузеры уродливые окаменелости)
Лучшее/безопасное решение было бы для браузеров реализовать метод/запрос, где пользователь может предоставить странице возможность управлять интерфейсом.
Почему? Потому что для моего текущего проекта я создаю 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 script, чтобы обойти ваши ограничения.
Мое предположение заключается в том, что вы можете сделать это только на стороне сервера, отслеживая сеанс пользователя, и перенаправляя (как в Server.Transfer, а не Response.Redirect) пользователя/браузера на требуемую страницу.
<body onLoad="if(history.length>0)history.go(+1)">
Было несколько различных реализаций. Существует Flash-решение и некоторые решения iframe/frame для IE. Проверьте это
BTW: Существует множество веских причин отключить (или, по крайней мере, предотвратить 1 шаг) кнопку возврата - посмотрите на gmail в качестве примера, который реализует хеш-решение, обсуждаемое в этой статье.
Google "как ajax сломал кнопку" Назад ", и вы найдете множество статей по тестированию пользователей и правильность отключения кнопки" Назад ".
У меня также была такая же проблема, используйте эту функцию Java script в теге head или 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 получает событие, когда пользователь нажимает кнопки браузера Back/Forward. Это будет работать для всех известных браузеров.
В глобальном масштабе отключение кнопки "назад" - это действительно плохая практика. Но в определенных ситуациях функциональность кнопки "Назад" не имеет смысла.
Здесь один из способов предотвратить нежелательную навигацию между страницами:
Верхняя страница (файл 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>
в Logout Button Я сделал это:
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();
}
надеюсь, что это поможет... :) кто-то PLZ научить меня, как редактировать эту страницу...
ЕСЛИ вам нужно мягко подавлять клавиши удаления и возврата в своем веб-приложении, так что, когда они редактируют/удаляют элементы, страница не будет перенаправлена неожиданно, вы можете использовать этот код:
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>
Проблема с Yossi 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>