如何查找用户是单击浏览器后退按钮还是“刷新”按钮

问题描述 投票:13回答:8

我需要找到用户是否单击浏览器后退按钮或刷新按钮。

当他点击后退或刷新按钮时,我需要将页面重定向到错误页面。这该怎么做。

我需要在我的ASP.net页面的javascript中执行此操作

javascript asp.net browser back-button
8个回答
12
投票

首先,如果用户使用Back或者出于某种原因不得不刷新页面,给出错误消息是一个非常糟糕的主意。相反,你应该透明地处理它。考虑到由于运输级别的问题而导致页面无法完全显示 - 用户唯一的选择是重新加载或返回。

要回答您的问题,您必须自己跟踪用户的导航,这意味着在服务器端。在这里忘记java脚本。如果用户访问网站,您可以将该信息存储在与用户关联的会话中(有几种方法可以保留这些唯一会话,我不会在此处详细介绍)。如果您在内部结构中存储最近用户访问过的页面,则很容易确定两次访问的页面,或导航进入“错误”方向。

您可以通过构建“允许”导航图并在用户访问时遍历它来轻松地概括这一点(并使整个事物更加健壮,例如防止用户在网址之间疯狂跳跃,或一次返回多个步骤)网站。

如果用户正在进行“错误”导航(例如踩回,重新加载==两次访问),那么正确的行为就是让他回到正轨。不要给出他无法逃避的错误信息!由于他不被允许重装或回去,他没有选择权。


5
投票

你不能。浏览器不会将自己的ui事件发送到服务器。你得到的只是http请求,其中一个看起来非常像另一个。也许单击后退按钮或者他们只是重新输入了最后一个URL。告诉我们它导致的问题,我们可以帮助您调整项目以更好地使用http协议。


4
投票

使用存储在会话中的guid /或时间戳实现PageToken,并将值与表单上的隐藏字段进行比较。我是通过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
投票

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

Without 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
投票

我认为你想要这样做是因为回发以避免重新提交一些动作或数据吗?具有讽刺意味的是,在asp.net webforms之前,这并不是一个大问题...因为你通常不得不发布到不同的URL而不是相同的URL(实际上非​​常像asp.net mvc)。

我喜欢使用的一个技巧...即使在最技术性的点上更慢......是有一个输入页面和一个帖子页面。帖子页面的HTML输出是一些超级最小的HTML,其中包含一个微小的javascript,它将浏览器历史记录中的当前URL(发布页面)替换为结果页面(如果您真的想要,甚至可以替换原始引用页面)。结果是当用户单击后退按钮时,他将被发送到原始输入页面,或者如果他点击刷新,他已经在新的结果页面上。

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

1
投票

我们在Java / Struts1中通过在提交按钮上放置一个属性来完成它。如果单击了提交按钮,则按钮文本将在ActionForm的属性中发送。如果用户刷新了未设置值的信息,那么我们就知道用户没有点击该按钮。在这种属性为空的情况下,我们返回并呈现了页面流的第一页。 ASP.Net中的YMMV。


1
投票

这只是检测用户是否使用后退/前进按钮登陆您的页面...唯一的问题是IE8及更低版本,浏览器版本无法处理此问题。

if(performance.navigation.type == 2)
{
    //Do your code here
}

0
投票

.NET 3.5可以很好地处理浏览器后退(和前进)按钮。使用Google搜索:“Scriptmanager EnableHistory”。您可以控制哪些用户操作将向浏览器的历史记录添加条目(ScriptManager - > AddHistoryPoint),并且只要用户单击浏览器后退/前进按钮,您的ASP.NET应用程序就会收到一个事件。


-1
投票

请记住,使用pushState / popstate组合的所有解决方案都不适用于Chrome https://www.bleepingcomputer.com/news/security/google-chrome-to-stop-sites-from-messing-with-the-back-button/

© www.soinside.com 2019 - 2024. All rights reserved.