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





К сожалению, это невозможно. Однако рассмотрите модель навигации своих приложений. Вы используете модель Post / Redirect / Get PRG? http://en.wikipedia.org/wiki/Post/Redirect/Get?
Эта модель более удобна для кнопки возврата, чем модель Postback.
Ничего печального в этом нет.
Действительный пункт. Мне просто грустно. ;)
Скотт - Значит, возможность отключения панелей инструментов и контекстного меню специфична для IE? Я видел LOB-приложения, которые полностью блокируют навигацию, но (опять же, к сожалению) они также требуют, чтобы у пользователя был IE.
Что ж, некоторые приложения могут запускаться в режиме «киоска», но для этого требуется запуск IE с переключателями командной строки.
@Jess: Это одно из тех неудобств, которые хорошие браузеры пытаются исправить, например, всплывающие окна без запроса. По этой причине Firefox получил настройку «Отключить или заменить контекстное меню».
Можно ли задать вопрос для подтверждения до того, как кнопка «Назад» приведет нас на предыдущую страницу? В случае ОК, перейдите к предыдущему пункту, если отмените, оставайтесь на месте
1. Создайте код своего веб-приложения, используя только AJAX, вообще не меняйте URL-адрес. 2. Обработайте onbeforeunload, чтобы предупредить, что они собираются покинуть приложение. Это также предотвращает утечку информации в историю браузера (и вы также можете отключить кеширование). Было бы слишком сложно внести это изменение в существующее приложение; этот подход возможен только в том случае, если вы создаете свое приложение таким образом с самого начала.
Вы не должны.
Вы можете прикрепить какой-нибудь скрипт к событию onbeforeunload страницы и подтвердить пользователю, что он хочет сделать; и вы можете пойти немного дальше и от пытаться до отключи это, но, конечно, это будет работать только для пользователей, у которых включен javascript. Вместо этого посмотрите на переписывание приложения, чтобы вы не совершали транзакции при каждой отправке страницы, а только в конце процесса.
Хммм ... событие onbeforeunload будет вызываться также при переходе со страницы, потому что пользователь просто переходит на другую страницу (не только потому, что пользователь нажал кнопку возврата), и сценарий будет вызван.
Вы можете разместить данные из каждой формы в окне _NEW. Это отключит кнопку возврата в каждом окне, но без javascript может быть сложно принудительно закрыть старое.
Вот предыдущий пост об этом: Запретить использование кнопки "Назад" (в IE)
ну, система рекомендаций не показывала этого, когда я создавал сообщение :(
Я настоятельно призываю вас пойти на все, чтобы не сломать кнопку «Назад», это верный способ оттолкнуть ваших пользователей и даже добраться до №1 на 10 главных ошибок веб-дизайна Джейкоба Нейлсена в 1999 году.
Возможно, вы могли бы подумать о том, чтобы задать вопрос: «Как не сломать кнопку возврата для <вставьте свой сценарий сюда>?»
Если ответ Скотта близок к истине, подумайте о переходе на модель PRG. Если это что-то еще, расскажите подробнее и посмотрите, чем мы можем помочь.
Он не сказал, что хочет «сломать» кнопку возврата. Он хочет избежать распространенной ошибки, когда современные шаблоны проектирования Ajax не работают, потому что пользователь нажимает «Назад», что означает «Отменить то, что я только что сделал с вашим приложением Ajax», и вместо этого получает «Вернуть один произвольный и неоднозначный HTTP-запрос».
Для меня это просто гласит: «Он не хотел сломать кнопку возврата, он просто хотел сломать кнопку возврата, чтобы предотвратить ее поломку». : S Можно заставить AJAX / JavaScript и кнопки «Назад» работать нормально, все, что я предлагаю, это тот путь, которым я бы рекомендовал следовать.
Лучший вариант - не зависеть от обратных передач для управления потоком, однако, если вы застряли с ним (пока)
вы можете использовать что-то вроде этого:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");
Вскоре вы обнаружите, что он не будет работать во всех браузерах, но тогда вы можете ввести проверку в свой код, например:
if (Page.IsPostBack)
{
if (pageIsExpired()){
Response.Redirect("/Some_error_page.htm");
}
else {
var now = Now;
Session("TimeStamp") = now.ToString();
ViewState("TimeStamp") = now.ToString();
}
private boolean pageIsExpired()
{
if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
return false;
if (Session("TimeStamp") == ViewState("TimeStamp"))
return true;
return false;
}
Это в некоторой степени решит проблему. Код не проверен - только в качестве примера.
Все, что вы придумали для отключения кнопки «Назад», может не остановить ее в будущих браузерах.
Если это конец цикла разработки, я предлагаю вам попробовать некоторые предложения, приведенные выше, но когда у вас будет время, вы должны структурировать свой поток так, чтобы кнопка возврата не мешала логике вашего сайта, она просто возвращает пользователя на предыдущую страницу, например они ожидают этого.
Я придумал небольшой прием, который отключает кнопку «Назад» с помощью 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 back!
</body>
</html>
Но это работает - попробуйте.
Я в этом не сомневаюсь. Это просто плохой опыт для пользователя, который может фактически хотеть вернуться.
IE9 не позволяет мне прокручивать эту страницу вниз. Прекрасно работает в последних версиях FF, Chrome, Safari. Тем не менее, люди, которые будут использовать мое одностраничное приложение, будут использовать только IE <= 9.
Это не всегда плохо для пользователя, иногда это правильный опыт. например, страница может изменить свое состояние с помощью Ajax, например Gmail. когда пользователь нажимает «назад», пользователь фактически ожидает, что страница вернется к предыдущему государственный, а не вернется к предыдущему страница
Хотя это не очень хорошее решение, оно идеально подходит для конкретного приложения, над которым я работаю, и работает прекрасно. Но есть ли причина, по которой у IE9 есть проблемы? При прокрутке вниз он продолжает возвращаться к началу страницы. Любое решение для наших пользователей IE9?
Он использует привязки HTML для отключения кнопки «Назад», так что, когда пользователь щелкает назад, он фактически переходит к предыдущей привязке. в данном случае «# 1» или «#». если их нет на странице, страница будет прокручена вверх. Это можно исправить с помощью других якорных текстов или с помощью javascript.
@YossiS молодец !! .. именно то, что мне нужно.
Я смог добиться этого, используя:
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();
Когда я использовал Response.Cache.SetCacheability (HttpCacheability.NoCache); это помешало мне скачать офисные файлы.
Это правда, необходимо добавить правильную проверку, чтобы убедиться, что дублирующиеся данные не испортят ситуацию. Однако, как и в моем случае, я не могу полностью контролировать данные, так как после формы я использую сторонний API. Итак, я использовал это
history.go(+1);
Это отправит пользователя вперед к «квитанции», которая должна появиться после страницы «платеж», если он попытается вернуться на страницу «платеж» (например, просто предоставив платеж). Однако используйте экономно
Найдите ссылку ниже
Отключить функцию кнопки возврата в браузере с помощью JavaScript в asp.net | ASP.Net отключить кнопку браузера назад (с помощью javascript)
http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html
Во всех основных браузерах можно отключить кнопку «Назад». Он просто использует хеш-значения, чтобы полностью отключить кнопку «Назад». Просто поместите эти 5 строк кода на свою страницу
<script>
window.location.hash = "no-back-button";
window.location.hash = "Again-no-back-button";//for google chrome
window.onhashchange=function(){window.location.hash = "no-back-button";}
</script>
Хитрый..но работает ...
@Ankit: Великолепно! Спас мою жизнь! Спасибо!!!
не во всех случаях корректно работает, а именно хром, сафари.
Пожалуйста, не делай этого! Это действительно раздражает, если страницы не справляются с основными функциями браузера.
Я полностью понимаю, что просто ответил на заданный вопрос, это зависит от читателя, хорошо это или нет.
Если я использую ваш сайт, кнопка "Назад" по-прежнему МОЯ. Не связывайся с моим ... ;-)