Как узнать, нажимает ли пользователь кнопку браузера "Назад" или кнопку "Обновить"

Мне нужно выяснить, нажимает ли пользователь кнопку браузера «Назад» или кнопку «Обновить».

Мне нужно перенаправить страницу на страницу с ошибкой, когда он нажимает кнопку «Назад» или «Обновить». Как это сделать.

Мне нужно сделать это в javascript для моей страницы ASP.net


person balaweblog    schedule 15.11.2008    source источник


Ответы (8)


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

Чтобы ответить на ваш вопрос, вы должны сами отслеживать навигацию пользователя, то есть на стороне сервера. Забудьте здесь о java-скрипте. Если пользователь посещает веб-сайт, вы можете сохранить эту информацию в сеансе, связанном с пользователем (существует несколько методов сохранения этих уникальных сеансов, и я не буду вдаваться в подробности здесь). Если вы сохраняете в своих внутренних структурах, какие страницы пользователь посещал в последнее время, легко определить страницу, которую посещали дважды, или навигацию, идущую в «неправильном» направлении.

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

Правильное поведение тогда, если пользователь выполняет «неправильную» навигацию (например, отступает, перезагружается == посещает дважды), - это вернуть его в нужное русло. Чтобы не выдавать сообщение об ошибке, ему не сбежать! Поскольку ему не разрешено перезаряжаться или возвращаться, у него не осталось вариантов.

person ypnos    schedule 15.11.2008
comment
Тот, кто дал -1, может указать причину, пожалуйста! - person ypnos; 27.08.2009
comment
Есть несколько веских причин для остановки обновления страницы, как правило, по завершении транзакции. Однако, как вы говорите, вам необходимо обнаружить это на сервере и отобразить соответствующую страницу / сообщение (например, ваш платеж уже был принят). - person GlennG; 04.06.2013
comment
Лучше ответить на заданный вопрос, чем заявлять, почему вы вообще не думаете, что это нужно делать. - person dcinadr; 06.06.2014
comment
Я даю ответ, который считаю наиболее полезным для спрашивающего. Форма может не полностью соответствовать вопросу, потому что правильно задать вопрос иногда так же сложно, как дать правильный ответ. В этом конкретном случае сам @balaweblog согласился, что мой ответ был для него наиболее полезным среди нескольких других, приняв мой ответ. Честно говоря, я не понимаю, как вы думаете, что шесть лет спустя знаете лучше и чувствуете желание проголосовать против. И все же хорошего дня. - person ypnos; 06.06.2014

Вы не можете. Браузер не отправляет на сервер собственные события пользовательского интерфейса. Все, что вы получаете, - это HTTP-запросы, и один очень похож на другой. Может быть, он нажал кнопку «Назад», или, может быть, они просто повторно набрали последний URL. Сообщите нам, какие проблемы это вызывает, и мы поможем вам адаптировать ваш проект для работы с протоколом http немного лучше.

person Joel Coehoorn    schedule 15.11.2008

Реализуйте PageToken, используя guid / или временную метку, хранящуюся в сеансе, и сравните значение со скрытым полем в форме. Я сделал это с помощью заголовка Класс PageToken. Если значение из скрытого поля и переменной сеанса не совпадают, значит, вы не синхронизированы, и вы справляетесь с этим. Уловка состоит в том, чтобы отобразить все события на вашей странице.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

В вашем методе Event перед вашим обычным кодом:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}
person Charles Byrne    schedule 04.05.2012

С Site.Master

В вашем Site.Master ставьте после <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Без Site.Master

В общем коде ставьте после <body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>
person Eduardo Cuomo    schedule 01.04.2014
comment
Но что, если вы не используете мастер-страницы? - person Off The Gold; 03.04.2014
comment
интересная идея. Как бы сложно ни было перевести главную страницу на одну страницу с другими страницами (которые хотят поддерживать обновление), можете ли вы уточнить? - person Casper Leon Nielsen; 13.12.2014

Я предполагаю, что вы хотите сделать это из-за обратной передачи, чтобы избежать повторной отправки некоторых действий или данных, верно? по иронии судьбы, это не было такой большой проблемой до веб-форм asp.net ... потому что вам обычно приходилось публиковать сообщения по другому URL-адресу вместо того же (как на самом деле asp.net mvc).

Один трюк, который мне нравился ... хотя в самых технических моментах он медленнее ... заключался в том, чтобы иметь страницу ввода и страницу сообщения. HTML-вывод страницы сообщения представлял собой суперминимальный HTML-код с крошечным javascript, который заменял текущий URL-адрес (страницы сообщения) в истории браузера страницей результатов (или даже исходной ссылочной страницей, если вы действительно хотели). В результате, когда пользователь нажимал кнопку «Назад», он отправлялся на исходную страницу ввода или, если он нажимал «Обновить», он уже был на новой странице результатов.

<html><body onload="location.replace('someURL.asp')"></body></html>
person Joel Martinez    schedule 15.11.2008

Мы сделали это в Java / Struts1, поместив свойство на кнопку отправки. Если была нажата кнопка отправки, текст кнопки будет отправлен в свойство в ActionForm. Если пользователь обновил информацию, значение не было установлено, поэтому мы знали, что пользователь не нажимал кнопку. В этом случае, когда свойство было пустым, мы вернулись и отрендерили первую страницу потока страниц. YMMV в ASP.Net.

person Ed Griebel    schedule 17.01.2009

Это просто определяет, попадает ли пользователь на вашу страницу с помощью кнопок назад / вперед ... единственная проблема связана с IE8 и ниже, версия браузера не может справиться с этим.

if(performance.navigation.type == 2)
{
    //Do your code here
}
person Max Alexander Hanna    schedule 12.04.2019

.NET 3.5 может очень хорошо обрабатывать кнопки браузера "назад" (и "вперед"). Выполните поиск в Google: "Scriptmanager EnableHistory". Вы можете контролировать, какие действия пользователя будут добавлять запись в историю браузера (ScriptManager -> AddHistoryPoint), и ваше приложение ASP.NET будет получать событие всякий раз, когда пользователь нажимает кнопки браузера «Назад / Вперед».

person Corne    schedule 27.08.2009