Запретить использование кнопки "Назад" (в IE)

Таким образом, малые и средние предприятия на моем текущем месте работы хотят попробовать отключить кнопку «Назад» для определенных страниц. У нас есть страница, на которой пользователь делает выбор и отправляет их на обработку. В некоторых случаях им необходимо ввести комментарий на другой странице.

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

Я знаю, что есть несколько разных решений для этого (и многие из них намного элегантнее, чем отключение кнопки возврата), но это то, что у меня осталось. Можно ли запретить кому-либо вернуться на предыдущую страницу, изменив поведение кнопки «Назад». (например, submit -> return false sorta thing).

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

Я понимаю, что все говорят, что это плохая идея, и я согласен, но иногда вам просто нужно делать то, что вам говорят.


person kemiller2002    schedule 10.09.2008    source источник
comment
4GuysFromRolla тщательно изучил отключение кнопки «Назад». ‹4guysfromrolla.com/webtech/111500-1.shtml ›Я рекомендую вы читаете эту статью, они также говорят вам, почему это не сработает (во всех сценариях).   -  person Espo    schedule 10.09.2008
comment
+1 из-за того, что иногда приходится использовать DTWT.   -  person Simon    schedule 04.05.2011


Ответы (15)


Не делай этого, просто не делай этого. Это плохой дизайн интерфейса и заставляет браузер пользователя вести себя не так, как он ожидает.

Я бы расценил любой сценарий, который успешно остановил работу моей кнопки «Назад», как взлом, и ожидал бы, что команда IE выпустит исправление безопасности для него.

Кнопка "Назад" является частью интерфейса их программы, а не вашего веб-сайта.

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

person Keith    schedule 10.09.2008
comment
Кит на высоте. Статья 4 парней, на которую ранее ссылались, даже заканчивается: После моего исчерпывающего поиска я обнаружил, что по-прежнему нет способа полностью отключить кнопку возврата во всех случаях. Дох! Мне не нужно читать две статьи, чтобы прочитать последнюю! - person rp.; 10.09.2008
comment
согласился Кит. Мы пережили примерно такую ​​же ситуацию на моей работе, и спустя долгое время мы поняли, что было бы проще реорганизовать приложение, чтобы не отключать кнопку «Назад». - person Jared; 10.09.2008
comment
Когда я нажимаю кнопку «Назад», и веб-сайт выдает ошибку «Страница больше не действительна», я не считаю это неожиданным, я понимаю, что поступил неправильно, я думаю, что большинство пользователей с этим согласны. Вы чувствуете себя виноватым за попытку переписать историю. - person stuartdotnet; 27.09.2012
comment
@StuartDobson - да, и это стандартный способ. Пользователи все еще могут возвращаться и продолжать возвращаться, их браузер просто не перезагружает страницы. - person Keith; 27.09.2012

Нет, ты обречен. Даже если вы открываете страницу в другом браузере и скрываете кнопку «Назад», всегда есть клавиша Backspace.

Проблема с маркетологами и аналитиками состоит в том, что некоторые из них не понимают фундаментальной концепции Интернета без гражданства. Они не понимают, что страница полностью, совершенно не осведомлена о браузере, использующем ее, и что абсолютный контроль над браузером полностью выходит за рамки возможностей веб-страниц.

Лучший способ отговорить пользователей нажимать кнопку "Назад" - убедиться, что ваша страница теряет все данные, когда они нажимают "Назад", например, страница комментариев - единственная точка, где можно сохранить данные. , и если они все же нажмут кнопку «Назад», им придется сделать все заново (подумайте в духе pragma: nocache).

Пользователи будут жаловаться, конечно, но они - причина того, что это богом забытое требование существует, верно?

person Jon Limjap    schedule 10.09.2008

Я видел это раньше:

window.onBack = history.forward();

Это определенно грязный хакер, и, если это вообще возможно, я бы попытался не отключать кнопку возврата. И пользователь, вероятно, все еще может довольно легко обойти это. И в зависимости от кеширования нельзя сказать, будет ли обработан код сервера или сначала будет запущена кешированная страница с JavaScript.

Так что да, используйте на свой страх и риск :)

person David Mohundro    schedule 10.09.2008
comment
Ваш код нарушит это требование? Из-за двойной публикации информации я не могу вернуть ее на предыдущую страницу, а затем перейти на текущую. Я могу только сделать это не прямо с текущей страницы - person Espo; 10.09.2008
comment
Я использовал веб-приложение, в котором это делалось раньше, и это было одной из самых разочаровывающих вещей. - person Steven Benitez; 17.11.2010
comment
Согласен, я ненавижу сайты, которые делают это - я думаю, что это ломает сеть. Я также не участвовал в требованиях к проекту, в котором использовалась именно эта техника :) - person David Mohundro; 18.11.2010
comment
Пример кода не имеет смысла. Он создает новую глобальную переменную с именем onBack и присваивает ей значение undefined, поскольку history.forward () не имеет возвращаемого значения. Идея могла быть window.onback = history.forward;, (вызов window.forward при возникновении события onback - что не сработает, так как события onback нет). Код по-прежнему работает как вызов history.forward(), который отправляет пользователя обратно на страницу, на которой он был до нажатия кнопки возврата ... - person Mira Weller; 22.12.2016
comment
В противном случае я согласен с тем, что это плохая идея ;-) - person Mira Weller; 22.12.2016

Я придумал небольшой прием, который отключает кнопку «Назад» с помощью 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";
}
// If you want to skip the auto-positioning at the top of browser window,you can add the below code:
window.location.hash=' ';
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>
person Yossi Shasho    schedule 04.05.2011
comment
в IE9 это заставляет страницу прокручиваться вверх и не позволяет мне прокручивать страницу - person chrism; 13.02.2012

У вас есть доступ к исходному коду на стороне сервера? Если это так, вы можете поставить галочку на первой странице, которая перенаправляет на вторую страницу, если информация уже была отправлена ​​(вам, очевидно, нужно использовать для этого сеансы). На прежней работе мы так обрабатывали многоэтапные заявки (заявка как заявка на прием).

person Brian Warshaw    schedule 10.09.2008

Не могли бы вы переместить комментарий на предыдущую страницу и сделать его там обязательным полем?

Отключение кнопки "Назад" не работает.

person Joel Coehoorn    schedule 10.09.2008

Из-за изоляции безопасности javascript в браузере вы не можете изменить то, что делает кнопка «Назад».

Возможно, вы могли бы сохранить в сеансе пользователя что-то, что указывает на необходимость комментария, и иметь любую страницу в приложении, которую пользователь пытается загрузить с перенаправлением на страницу комментариев?

Что, если пользователь закрывает свой браузер, когда попадает на страницу комментариев?

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

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

Или просто поставить поле для комментария на странице формы?

person pkaeding    schedule 10.09.2008

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

Тогда они, вероятно, также достаточно умны, чтобы ввести «без комментариев» в поле для комментариев.

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

person Peter Hilton    schedule 10.09.2008
comment
Это также просто крик о каком-то плохом коде. Почему люди могут обойти комментарий, нажав кнопку "Назад"? Вы не решите плохой код, взломав браузер пользователя. - person Doug Moore; 18.09.2008

Отключение кнопки «Назад» выглядит как «грубая сила».

Другой вариант - вы можете перейти в модальное диалоговое окно, в котором нет командных кнопок, провести пользователей по рабочему процессу и закрыть диалоговое окно, когда процесс будет завершен.

person Guy Starbuck    schedule 10.09.2008
comment
Я полностью согласен с вами, но мне сказали, что это то, с чем я застрял. - person kemiller2002; 10.09.2008
comment
Вы не зацикливаетесь на этом - вы не можете этого сделать. Это не жизнеспособное, действительное или этичное решение. ИСПРАВИТЬ КОД - person Doug Moore; 18.09.2008

Вы должны защитить свое приложение от двойной отправки, а не нарушать пользовательский интерфейс, чтобы скрыть ошибку.

person Kornel    schedule 16.11.2008

Для этого просто нет надежного способа. Вы не можете гарантировать, что в 100% случаев вы сможете помешать пользователю делать это.

Имея это в виду, стоит ли прибегать к чрезвычайно экзотическим решениям, чтобы отключать "большую часть" времени? Это вам решать.

Удачи.

person Matt Dawdy    schedule 10.09.2008

Как простое решение: попробуйте это. Вставьте туда панель обновления и кнопку и используйте javascript, чтобы скрыть ее, а затем нажмите ее при загрузке страницы. Да, я понимаю, что это приведет к тому, что ваша страница будет отправляться обратно при загрузке и может не работать, если javascript отключен, но, безусловно, поможет вам добиться приличного ответа на проблему с кнопкой «Назад». Энди

person Andy    schedule 06.04.2009

Вы можете запретить им вернуться на предыдущую страницу. location.replace() заменяет запись истории текущей страницы новой страницей, поэтому ...

page1.html: пользователь нажимает ссылку, ведущую на page2.html.

page2.html: пользователь нажимает ссылку, вызывающую location.replace('page3.html');

page3.html: пользователь нажимает кнопку "Назад" и переходит на page1.html.

Это может не подходить для выполнения POST, но вы можете отправить данные в веб-службу через AJAX, а затем вызвать location.replace ()

person Webveloper    schedule 29.06.2012

Если вы запускаете новое веб-приложение с нуля или у вас есть достаточно времени, чтобы доработать свое приложение, вы можете использовать JavaScript и AJAX, чтобы избежать использования истории браузера, функций возврата и пересылки.

  • Откройте свое приложение в новом окне до или сразу после входа в систему.
  • Если хотите, используйте параметры окна, чтобы скрыть панель навигации (с помощью кнопок назад и вперед).
  • Используйте AJAX для всех запросов к серверу, никогда не меняя URL-адрес расположения окна.
  • Используйте простой веб-API для получения данных и выполнения действий, а также для визуализации приложения с помощью JavaScript.
  • В истории окна будет только один URL.
  • Кнопки "назад" и "вперед" ничего не делают.
  • Окно может закрываться автоматически при выходе из системы.
  • Никакая информация не попадает в историю браузера, что может помочь с безопасностью.

Этот метод отвечает на вопрос, но он также противоречит передовой практике по нескольким причинам:

  • Кнопки «Назад» и «Вперед» должны работать должным образом.
  • Приложение не должно открывать новые окна браузера.
  • Приложение должно работать без JavaScript.

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

person Sam Watkins    schedule 02.06.2015

Я не вижу такого решения:

function removeBack(){
	window.location.hash="nbb";
	window.location.hash="";
	window.onhashchange=function(){window.location.hash="";}
}

person Denis Chenu    schedule 17.10.2015
comment
Вероятно, это не сработало в Internet Explorer 2008 года: D - person Mira Weller; 22.12.2016