Вимкнути кнопку повернення браузера


98

Як відключити кнопку BACK BACK (у веб-переглядачах)?


92
Ви не володієте комп’ютерами своїх користувачів або їх браузерами.
Мисливець на екземпляр

47
+1 Оскільки, хоча я погоджуюся, що відключення кнопки повернення веб-переглядачів є «поганою практикою», я не бачу причин відмовлятись від самого питання, відповідаючи та пояснюючи, чому це шлях до imo.
ChristopheD

45
Чому ми вороже ставимося до цього питання? Наскільки ми знаємо, людина, яка задає це питання, вже знає, що це погана практика використання, але вони лише відповідають вимогам, або, можливо, вони просто хочуть чомусь навчитися. Чому б ми просто не зробили вигляд, що це гіпотетичне запитання, і не відповісти, як би ми це зробили, якби ми зробили таке?
thomasrutter

5
Деякі речі ніколи не слід робити, незалежно від будь-якого бажання їх робити. Наявність вимоги, що не підлягає обороту, миттєво говорить про те, що вимоги були встановлені людьми, які не встановлюють їх для бізнесу, що є значно більшою проблемою.
annakata

37
Фу, я написав найдивовижніший коментар коли-небудь, але втратив його, коли випадково натиснув кнопку "назад".
Ден Вільямс

Відповіді:


26

Це питання дуже схожий на цей один ...

Потрібно змусити кеш-пам'ять закінчитися, щоб це діяло. Поставте наступний код на коді сторінки позаду.

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

14
Зауважте, що зробити сторінку не кешованою не досягає того, чого хотів ОП: відключити відвідування сторінок за допомогою кнопки "назад". Навіть якщо браузер не виконує кеш-пам'ять при використанні кнопки "Назад" (які браузери не зобов'язані робити AFAIK), вони все одно забезпечують спосіб перезавантажити цю сторінку (зазвичай після показу діалогового вікна попередження). Тож якщо ви дійсно не хочете, щоб ваші користувачі поверталися на цю сторінку, це може бути ще гірше, оскільки запит на цю сторінку повинен пройти весь шлях до початкового сервера. Вам знадобиться щось на стороні сервера, щоб виявити, що сторінку було переглянуто. Заголовки можна ігнорувати.
thomasrutter

60

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

Зробіть так, щоб ваші сторінки обробляли можливість користувачів повернути сторінку або дві; не намагайтеся калічити їх програмне забезпечення.


6
Дякую чувак, річ у тому, що якщо ви створюєте додаток AJAX, компроміс між вимиканням кнопки "назад" або переглядом програми та розробкою відповідних дій для кожного можливого сценарію може призвести до відключення кнопка "назад" - більш привабливий варіант із двох.
david.barkhuizen

Я погодився б з Джонатаном, особливо з потоком рекламних програм про переадресацію шкідливих програм, які наразі затоплюють Інтернет, вони вже зловживають системою оповіщення, щоб ускладнити залишати свої сторінки, не даючи їм можливості насправді заблокувати вас на своїй сторінці
MikeT

46

Я придумав невеликий хак, який відключає кнопку назад за допомогою 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", АЛЕ - це та сама веб-сторінка, тому браузеру не потрібно перезавантажувати сторінку. - Йоссі Шашо


1
Схоже, цей скрипт додає "#" до URL-адреси, коли сторінка завантажується, і кожні 50 мс додає URL-адресу 1.
ashes999

6
Цей сценарій використовує той факт, що браузери розглядають те, що відбувається після знака "#" в URL, як частину історії перегляду. Що це робить так: Коли сторінка завантажується, до URL додається "# 1". Через 50 мс "1" видаляється. Коли користувач натискає "назад", браузер змінює URL-адресу назад на те, що було до видалення "1", АЛЕ - це та сама веб-сторінка, тому браузеру не потрібно перезавантажувати сторінку.
Йоссі Шашо

1
зауважте, що URL-адреса змінюється двічі: ми робимо це лише для того, щоб замаскувати реалізацію, тому ніхто не побачить, що ми додали "1". Тож насправді, коли користувач натискає назад, сторінка на мить знову додає "# 1" та видаляє його знову. BTW - це не повинно бути "1", це може бути будь-який рядок.
Йоссі Шашо

2
Проблема з цим полягає в тому, що сторінка прокручується до верху кожні 50 мс. Якщо у вас форма більше, ніж висота вікна, це унеможливить заповнення значень форми.
3komma14

Дуже дякую. Це дуже корисно для особливо інтерактивної сторінки на базі JavaScript, де прокрутка ліворуч та праворуч є частиною механіки. Це допомагає усунути проблему жесту прокрутки на Mac OS X, який випадково повертає користувачів "назад" на сторінку (все це легко зробити, якщо вони вже прокручені до кінця).
Ієн Коллінз

34

Інші підходили, щоб сказати "не роби цього", але це насправді не відповідає на питання афіші. Давайте просто припустимо, що всі знають, що це погана ідея, але нам цікаво, як це все-таки робиться ...

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

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

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

Додаток онлайн-банкінгу, який надає мій банк, такий. Якщо ви взагалі користуєтесь кнопкою "назад", більше посилань не працюватиме і більше не можна буде перезавантажувати сторінки - замість цього ви бачите повідомлення про те, що не можете повернутися назад, і вам доведеться починати спочатку.


1
Мій банк застосовує інший підхід - він повністю припиняє сесію. Використання кнопки "назад" еквівалентно виходу із системи.
RobG

Це звучить як той самий підхід. Вони виявляють, що ви повернулися назад, і підкинули стан помилки.
thomasrutter

також Joomla працює над рішенням маркера, маркер генерується кожною сторінкою і кожною формою, інфакт має певні проблеми щодо цієї практики, наприклад, "коли користувач занадто сильно затримується на сторінці, а термін його маркер закінчується"
Маттео Бононі "петертер"

1
Не зрозумійте мене неправильно, є багато питань з цією практикою. Я це не рекомендую, я просто кажу, як це нормально досягається. Вони передають унікальні маркери між сторінками, щоб виявити, що ви не перейшли до одного із очікуваних посилань на попередній сторінці, а потім припиняєте сеанс чи показуєте помилку. Він перемикає кнопку "назад", переглядає вкладки, порушує закладки та / або обмінюється посиланнями, і багато іншого - і що більше, це насправді не вирішує жодних проблем.
thomasrutter

якщо проблема полягає в тому, що інформація втрачається або порушується вже якщо користувач намагається скористатися кнопкою "Назад", то відключення кнопки "назад" було б більш бажаним підходом.
PoloHoleSet

10

Хоча я сам шукаю відповідь, "Найкраща практика" застаріла ... Так само, як і браузери. (Дійсно, браузери - некрасиві скам'янілості)

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

Чому? Тому що для мого поточного проекту я будую 100% -ний вбудований JavaScript і керований інтерфейс. А кнопки "назад" не мають місця в моєму проекті, оскільки немає зміни сторінки. (Тобто криваво швидко і жодна сторінка не спалахує через оновлення. Так само, як справжня програма!)

Я знаю, чому можливості "хайджек" інтерфейсу немає, і я це розумію. Але принаймні ми повинні мати можливість запитувати його у браузера! Тепер це справді було б "найкращою практикою" без небезпеки хайджек.

Але браузери - це браузери. Я не очікую, що в цьому плані щось трапиться.


1
100% не згодні, хоча ця функціональність була б чудовою для 99% веб-розробників, що залишає решту 1%, які зловживають б цією функціональністю, це занадто небезпечно, щоб дозволити веб-сайту контролювати вашу здатність користуватися Інтернетом, на мою думку Сценарій переспрямування між доменами потрібно або заборонити, або дозволити підтвердити, чи дозволено запускати сценарій через такий вид зловживань
MikeT

@MikeT - Як відключення кнопки "назад" під час переходу на мої власні сторінки додатків гальмує можливість будь-кого користуватися Інтернетом?
PoloHoleSet

@PoloHoleSet якщо у вас є можливість відключити кнопку повернення браузера, то це робить і всі, вам потрібно лише одне переадресація, щоб надіслати вас на сторінку, на яку ви не хотіли переходити, і якщо вони можуть відключити ваші керування навігацією в браузері, як ти втечеш? Я впевнений, що ви натрапили на "у вас сторінку з вірусами", де вони пропонують вам встановити свій вірус, щоб видалити неіснуючий вірус. Тепер уявіть собі той сайт, де вони можуть насправді завадити вам покинути
MikeT

@MikeT - я можу ввести будь-який інший URL у вікно навігації, я можу закрити вкладку, я можу відключити javascript. Справа не в тому, чи може хтось МОЖИТИ, тому що ви можете, я можу, хто може. Що стосується політики, люди говорять, що ви НЕ повинні, якщо можете. Ми не говоримо про те, як ми б створили браузер, ми говоримо про те, як ми програмуємо додаток.
PoloHoleSet

@PoloHoleSet, якщо ви збираєтесь заблокувати навігацію, вам потрібно буде заблокувати більше, ніж просто кнопку назад, оскільки історія браузера та набрані URL-адреси також нададуть користувачам спосіб обійти ваш робочий процес. і, як я сказав, ми говоримо не про те, що ви чи я робите, а про шкідливий елемент, якщо єдиний спосіб запобігти зловмисному веб-сайту взяти під контроль ваш браузер - вимкнути всі js у вашому браузері, то ви зламали Інтернет як сучасна мережа покладається на сценарії, щоб надати вміст, який є моєю
суттю

4

Я шукав те саме питання, і знайшов наступний код на сайті. Думав поділитися цим тут:

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

Однак, як зазначають вищезгадані користувачі, це ніколи не є хорошою практикою, і цього слід уникати з усіх причин.


2
було б добре, якби ви могли вказати причини, чому цього слід уникати.
Кріс Сноу

Як я розумію, ви технічно не можете відключити кнопку "Назад" у чиємусь веб-переглядачі, ви можете зробити так, щоб кнопка була недоступною або продовжувала завантажувати ту саму сторінку. Замість того, щоб робити це через JS, використовуйте код сторони сервера та використовуйте правильну логіку, для якої не потрібно використовувати кнопку Назад. Слід використовувати альтернативні дії, такі як перезавантаження тієї самої сторінки або показ спеціального повідомлення.
користувач704988

2

Якщо ви покладаєтесь на технологію на базі клієнта, її можна обійти. Наприклад, Javascript може бути відключений. Або користувач може виконати сценарій JS, щоб обійти ваші обмеження.

Я здогадуюсь, що ви можете це зробити лише шляхом відстеження сеансу користувача на стороні сервера та перенаправлення (як у Server.Transfer, не Response.Redirect) користувача / браузера на потрібну сторінку.



2

Було кілька різних реалізацій. Є флеш-рішення та деякі рішення iframe / frame для IE. Перевірте це

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

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

Google "як Ajax зламав кнопку" назад ", і ви знайдете безліч статей про тестування користувача та обґрунтованість відключення кнопки" назад ".


Ознайомтесь і з новим переглядачем фотографій Facebook. Зауважте, що кнопка "назад" повертає вам фотографію (що саме ви хочете), а не робити браузер за замовчуванням
DallinDyer

2

У мене також була така ж проблема: використання цієї функції сценарію Java на тезі head або в, 100% працює добре, не дозволить вам повернутися назад.

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

1

Спробуйте цей код. Працювали для мене. Це в основному змінює хеш, як тільки сторінка завантажується, яка змінює сторінку останньої історії, додаючи "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>


0

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


0

В усьому світі відключення кнопки "назад" - це дійсно погана практика. Але в певних ситуаціях функціонування кнопки "назад" не має сенсу.

Ось один із способів запобігти небажаній навігації між сторінками:

Верхня сторінка (файл 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>";
    }
?>

Ефект полягає в тому, щоб дозволити перехід від верхньої сторінки до другої сторінки та назад (наприклад, Скасувати) за допомогою власних посилань. Але після повернення на головну сторінку кнопки повернення браузера заборонено переходити до другої сторінки.


0

Навіть я раніше стикався з тією ж ситуацією ... і не мав жодної допомоги. спробуйте ці речі, можливо, вони допоможуть вам

в <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, навчить мене редагувати цю сторінку ...


а) відредагуйте свою відповідь b) натисніть на знак питання c) натисніть на розширену довідку d) прочитайте та застосуйте :-) Також зауважте, що ctrl-k un / відступає вибраному блоку, щоб відключити / відформатувати як код. Плюс форматер не може добре впоратися з вкладками (мабуть, тут не проблема)
kleopatra

0

ЯКЩО вам потрібно м’яко придушити клавіші видалення та зворотної області у вашому веб-додатку, щоб під час редагування / видалення елементів сторінка не переходила несподівано, ви можете використовувати цей код:

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

0

Спробуйте цей код. Вам просто потрібно реалізувати цей код на головній сторінці, і він працюватиме на всіх сторінках

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

0

Проблема з Йоссі 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(); });

0

Це, здається, працювало на нас.

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

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

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.