单击PHP中的后退按钮后检测页面重新加载

时间:2014-10-19 20:45:00

标签: php jquery browser back-button

我正在寻找一种方法来检测单击后退按钮后何时重新加载页面,因此我可以有选择地忽略错误。让我解释一下原因:

想象一个显示一些数据的页面,由id标识:

/show/some/data?id=5

最初,id存在并显示页面。如果id不存在,则会显示一条错误消息并记录错误,因为这不应该发生,并且会指示应用程序中的链接断开。

现在假设用户查看数据,决定删除它,并在删除后,使用后退按钮再次转到同一页面(顺便说一句,这不是假设,我已经在我的应用程序中看到了这一点)。现在,id不再有效,触发错误。如果我可以在使用后退按钮后区分初始页面加载和第二页面加载,我的错误处理可能会更宽松。我的理由是应用程序中的断开(前向)链接是一个致命的错误。单击后退(当最初没有时)的链接断开很可能是由用户在此期间采取的某些操作引起的。在这种情况下,我宁愿将用户重定向到概述页面而不是显示应用程序错误。

我认为解决这个问题的一种方法是将一些随机生成的id附加到url:

/show/some/data?id=5&rnd=<?php print rand(); ?>

并记录会话中使用的随机ID。如果id重复,我可以假设页面已经重新加载,并有选择地忽略一些错误。

但是,这需要在应用程序中更改许多链接。我还可以使用javascript / jQuery来改变页面上的所有链接以达到同样的效果:

$("a").attr('href', function (i, h) {
    return h + (h.indexOf('?') != -1 ? "&" : "?") + "rnd=" + Math.random ();
});

这种侵略性稍微小一点,但仍然相当沉重,以解决这样一个看似微不足道的问题。我想知道是否有或者可以采用独立的方式来做到这一点。后端应用程序是否有任何方法可以区分是通过向前单击链接来加载页面还是在单击后重新加载页面?或者是否有更优雅的javascript解决方案?

1 个答案:

答案 0 :(得分:0)

由于您尝试(改变)改变浏览器的行为,因此没有完美的解决方案。我能想到的最简单的想法是设置一个会话变量,其中包含已删除页面的列表,并在删除页面上将页面ID推入其中。

然后,您需要更新错误处理程序,以另外检查已删除页面列表中是否存在请求的页面ID。这样你根本不必弄乱网址。

以下是一个示例流程:

  • 用户请求页面ID 1
  • app检查数据库,它不存在
  • 应用检查会话,它不在已删除的网页列表中
  • 显示错误消息,服务器上记录了错误
  • 用户请求页面ID 2
  • app检查数据库,它存在,向用户显示页面
  • 用户点击删除按钮
  • 页面的ID被添加到已删除页面的会话列表中并且页面被删除
  • 用户返回(或手动输入网址,这是一项额外功能)
  • app检查数据库,id 2不存在
  • 应用程序检查会话,已删除页面列表中的ID为2
  • 显示
  • 错误消息,未记录任何错误

您还可以更进一步跟踪所有访问过的网页,这样您就会知道,如果几分钟之前有某些内容,现在不是,那么用户必须删除它。如果需要,这将允许您处理更多此类事件。