使用jQuery/Javascript防止任何形式的页面刷新

pan*_*kaj 76 javascript jquery refresh

一旦用户在我的页面上,我不希望他刷新页面.

  1. 任何时候,用户点击F5或刷新顶部的按钮.他应该得到警告说

    您无法刷新页面.

  2. 此外,如果用户打开新选项卡并尝试访问prev选项卡中的相同URL,则应该收到警报

    您无法在2个标签中打开同一页面

无论如何,我可以使用JavaScript或jQuery做到这一点?第一点非常重要.

Set*_*eth 168

#1可以通过实现window.onbeforeunload.

例如:

<script type="text/javascript">
    window.onbeforeunload = function() {
        return "Dude, are you sure you want to leave? Think of the kittens!";
    }
</script>
Run Code Online (Sandbox Code Playgroud)

系统将提示用户显示该消息,并提供留在页面上或继续使用的选项.这变得越来越普遍.如果您在键入帖子时尝试离开页面,Stack Overflow会执行此操作.你不能完全阻止用户重新加载,但如果他们这样做,你可以让它听起来真的很可怕.

#2或多或少是不可能的.即使您跟踪了会话和用户登录,您仍然无法保证您正确检测到第二个选项卡.例如,也许我打开一个窗口,然后关闭它.现在我打开一个新窗口.您可能会将其检测为第二个选项卡,即使我已经关闭了第一个选项卡.现在您的用户无法访问第一个窗口,因为他们关闭了它,并且他们无法访问第二个窗口,因为您拒绝了它们.

事实上,我银行的在线系统很难做到#2,上述情况一直都在发生.我通常必须等到服务器端会话到期才能再次使用银行系统.

  • 尽管为跨浏览器兼容性并防止了库问题,尽管应该使用window.addEventListener(请参阅https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload)代替,但对我来说却有用。 (4认同)
  • 请注意,onbeforeunload 事件在 Opera 浏览器版本中不可用。 (2认同)
  • 如果用户选择留在页面上,有没有办法做一些事情。 (2认同)
  • @Seth,#2可以使用SharedWorker完成 (2认同)

Nic*_*ver 33

您不能阻止用户刷新,也不应该真正尝试.您应该回到为什么需要这个解决方案,这里的根本问题是什么?从那里开始,找到解决问题的不同方法.也许你详细说明了为什么你认为你需要这样做,这将有助于找到这样的解决方案.

打破基本的浏览器功能绝不是一个好主意,超过99.999999999%的互联网工作和刷新F5,这是用户的期望,你不应该打破.

  • @pankaj - 应该在应用程序站点上修复,例如cookie,以便用户跨选项卡共享会话. (16认同)
  • 我不确定你从哪里来这里.如果您的表单很脏,互联网上的无数站点会阻止浏览器刷新,提醒您可能会丢失更改.不知道为什么这会"破坏基本的浏览器功能". (4认同)
  • 你不应该这样做不是一个答案。这个意见可能很有价值,但只能作为可行解决方案的后记。 (3认同)

小智 13

虽然禁用F5键不是一个好主意,但您可以在JQuery中执行此操作,如下所示.

<script type="text/javascript">
function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };

$(document).ready(function(){
     $(document).on("keydown", disableF5);
});
</script>
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!

  • OSX怎么样,哪里是CMD + R?或移动哪里有按钮按?我不认为这是一个解决方案 (25认同)

Tod*_*odd 13

回到CGI的时代,我们有许多形式可以触发各种后端行动.例如对组的文本通知,打印作业,数据耕作等.

如果用户在一个页面上说"请稍等......执行一些可能需要一些时间的巨大工作".他们更有可能击中REFRESH,这将是不好的!

为什么?因为它会触发更缓慢的工作并最终陷入困境.

解决方案?允许他们做自己的表格.当他们提交表格时...开始你的工作,然后将他们引导到另一个告诉他们等待的页面.

中间的页面实际上保存了启动作业所需的表单数据.然而,WAIT页面包含一个javascript历史记录destroy.所以他们可以RELOAD等待他们想要的页面,它永远不会触发原始作业在后台启动,因为WAIT页面只包含WAIT本身所需的表单数据.

希望有道理.

历史销毁功能还阻止他们单击BACK然后刷新.

它非常无缝,并且在很多年里都很好用,直到非营利组织缩减为止.

示例:FORM ENTRY - 收集所有信息,在提交时,这会触发您的后端作业.

表单条目的响应 - 返回执行重定向到静态等待页面和/或POST/GET到另一个表单(WAIT页面)的HTML.

等待页面 - 仅包含与等待页面相关的FORM数据以及用于销毁最新历史记录的javascript.像(-1 OR -2)只能破坏最近的页面,但仍允许它们返回原来的FORM入口页面.

一旦他们进入您的WAIT页面,他们可以根据需要单击REFRESH,它永远不会在后端生成原始的FORM作业.相反,您的WAIT页面应该包含META定时刷新本身,因此它始终可以检查其作业的状态.当他们的工作完成后,他们会从等待页面重定向到您希望的任何地方.

如果他们手动刷新......他们只是在那里再添加一份他们的工作状态检查.

希望有所帮助.祝好运.

  • 您没有因为这个惊人且内容丰富的答案而获得足够的赞誉。谢谢!! (2认同)

Que*_*tin 6

不,没有.

我很确定没有办法拦截来自JS的刷新按钮的点击,即使有,也可以关闭JS.

您可能应该退出X(防止刷新)并找到Y的不同解决方案(无论可能是什么).