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

Мне нужно найти, нажимает ли пользователь кнопку браузера назад или кнопку обновления.

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

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

7 ответов


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

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

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

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


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


реализуйте 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);
    }
}

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

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

С 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>

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

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

<html><body onload="location.replace('someURL.asp')"></body></html>

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


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