Как узнать, нажимает ли пользователь кнопку браузера назад или кнопку «Обновить» - PullRequest
13 голосов
/ 15 ноября 2008

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

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

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

Ответы [ 8 ]

12 голосов
/ 15 ноября 2008

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

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

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

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

5 голосов
/ 15 ноября 2008

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

4 голосов
/ 04 мая 2012

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

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;
}
3 голосов
/ 01 апреля 2014

С 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>
1 голос
/ 17 января 2009

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

1 голос
/ 15 ноября 2008

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

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

<html><body onload="location.replace('someURL.asp')"></body></html>
0 голосов
/ 12 апреля 2019

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

if(performance.navigation.type == 2)
{
    //Do your code here
}
0 голосов
/ 27 августа 2009

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

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