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

Javascript 如何查找用户是单击浏览器后退按钮还是刷新按钮,javascript,asp.net,browser,back-button,Javascript,Asp.net,Browser,Back Button,我需要确定用户是单击浏览器后退按钮还是刷新按钮 当他单击后退或刷新按钮时,我需要将页面重定向到错误页面。如何做到这一点 我需要在javascript中为我的ASP.net页面执行此操作您不能。浏览器不会将自己的ui事件发送到服务器。您得到的只是http请求,其中一个看起来很像另一个。也许他们点击了后退按钮,或者他们只是重新输入了最后一个url。告诉我们它导致了什么问题,我们可以帮助您调整您的项目,使其更好地使用http协议。首先,如果用户出于任何原因重新使用或必须刷新页面,则给出错误消息是一个非

我需要确定用户是单击浏览器后退按钮还是刷新按钮

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


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

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

首先,如果用户出于任何原因重新使用或必须刷新页面,则给出错误消息是一个非常糟糕的主意。相反,你应该透明地处理这个问题。想想看,由于运输层面的问题,一个页面没有完全显示出来——用户唯一的选择就是重新加载或返回

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

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


如果用户做了一个“错误”的导航(比如后退,重新加载==访问两次),正确的行为就是让他回到正轨。不给他一个他无法逃脱的错误信息!由于不允许他重新加载或返回,他没有选择余地。

我想你之所以要这样做是因为回发可以避免重新提交某些操作或数据,对吗?讽刺的是,在asp.net webforms之前,这并不是一个大问题。。。因为您通常必须发布到不同的URL,而不是相同的URL(实际上很像asp.net mvc)

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

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


我们在Java/Struts1中通过在submit按钮上添加属性来实现。如果单击submit按钮,按钮文本将在ActionForm的属性中发送。如果用户刷新了信息,则没有设置值,因此我们知道用户没有单击按钮。在这个属性为空的例子中,我们返回并呈现页面流的第一页。ASP.Net.NET3.5中的YMMV可以很好地处理浏览器的后退(和前进)按钮。使用谷歌搜索:“Scriptmanager启用历史记录”。
您可以控制哪些用户操作将向浏览器历史记录中添加条目(ScriptManager->AddHistoryPoint),并且每当用户单击浏览器后退/前进按钮时,ASP.NET应用程序都会收到一个事件

使用存储在会话中的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
在您的
站点.Master
中,放在


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

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

给出-1的人可以说明原因,谢谢!通常在事务完成时停止页面刷新有一些合理的原因。但是,正如您所说,您需要在服务器上检测到这一点,并显示适当的页面/消息(例如,您的付款已被收取)。最好回答所问的问题,而不是说明为什么您认为不应该首先这样做。我给出了我认为对查询者最有帮助的答案。表格可能与问题不完全一致,因为有时正确提问和给出正确答案一样困难。在这个具体的案例中,@balaweblog自己也认为我的回答对他最有帮助,因为他接受了我的回答。老实说,我真不明白你怎么会认为六年后你知道得更好,并迫切想投反对票。祝你有一个愉快的一天。但是如果你不使用母版页呢?这个主意很有趣。无论翻译成一个单独的页面有多么困难,这些页面与其他页面(希望支持刷新)共享一个母版页-您能详细说明一下吗?
<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>
if(performance.navigation.type == 2)
{
    //Do your code here
}