Як відключити кнопку BACK BACK (у веб-переглядачах)?
Як відключити кнопку BACK 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) користувача / браузера на потрібну сторінку.
Було кілька різних реалізацій. Є флеш-рішення та деякі рішення iframe / frame для IE. Перевірте це
BTW: Існує маса вагомих причин відключення (або принаймні запобігання 1 кроку) кнопки "назад" - подивіться на gmail як на приклад, який реалізує хеш-рішення, обговорене у вищевказаній статті.
Google "як Ajax зламав кнопку" назад ", і ви знайдете безліч статей про тестування користувача та обґрунтованість відключення кнопки" назад ".
У мене також була така ж проблема: використання цієї функції сценарію Java на тезі head або в, 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();
}
і на сторінці входу я зосередив увагу на текстовому полі "Ім'я користувача" таким чином:
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>
Проблема з Йоссі 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(); });