使用jQuery / Javascript阻止任何forms的页面刷新
一旦用户在我的页面上,我不希望他刷新页面。
-
任何时候,用户在顶部点击F5或刷新button。 他应该警惕的说
您无法刷新页面。
-
此外,如果用户打开一个新的标签,并尝试访问prev选项卡中的相同的url,他应该得到一个警报
您无法在2个选项卡中打开相同的页面
无论如何,我可以使用JavaScript或jQuery做到这一点? 第一点非常重要。
#1可以通过window.onbeforeunload
实现。
例如:
<script type="text/javascript"> window.onbeforeunload = function() { return "Dude, are you sure you want to leave? Think of the kittens!"; } </script>
系统会提示用户input消息,并给出一个选项以保留在页面上或继续。 这变得越来越普遍。 如果您在input文章时试图离开页面,堆栈溢出会执行此操作。 你不能完全阻止用户重新加载,但如果他们这样做,你可以让它听起来真的很可怕。
#2或多或less是不可能的。 即使你跟踪会话和用户login,你仍然无法保证你正确地检测到第二个标签。 例如,也许我打开了一个窗口,然后closures它。 现在我打开一个新窗口。 即使我已经closures了第一个标签,您可能会将其检测为第二个标签。 现在你的用户不能访问第一个窗口,因为他们closures了它们,而他们不能访问第二个窗口,因为你拒绝了。
事实上,我的银行的在线系统真的很难做到#2,上述情况一直在发生。 我通常必须等到服务器端会话过期才能再次使用银行系统。
你不能阻止用户刷新,也不应该真的在尝试。 你应该回到为什么你需要这个解决scheme,这里的根本问题是什么? 从那里开始,find解决问题的不同方法。 也许是你详细说明了为什么你认为你需要这样做,这将有助于find这样的解决scheme。
打破基本的浏览器function从来不是一个好主意,超过99.999999999%的互联网工作和刷新F5,这是用户的期望 ,你不应该打破。
尽pipe禁用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>
希望这会有所帮助!
早在CGI的时代,我们有很多forms会触发各种后端行为。 如文本通知组,打印作业,数据养殖等。
如果用户在页面上显示“请稍等…执行一些可能需要一些时间的巨大工作”。 他们更可能击中REFRESH,这将是坏消息!
为什么? 因为这会引发更多的缓慢的工作,最终导致整个事情的停滞。
解决scheme? 让他们做他们的forms。 当他们提交表格…开始你的工作,然后引导他们到另一个页面,告诉他们等待。
中间的页面实际上保存了启动作业所需的表单数据。 然而,WAIT页面包含一个javascript历史销毁。 因此,他们可以RELOAD等待所有他们想要的页面,并且永远不会触发原始作业在后台启动,因为WAIT页面只包含WAIT本身所需要的表格数据。
希望是有道理的。
历史销毁function也阻止他们点击返回,然后刷新。
这是非常无缝的,并且在许多年以前都非常好,直到非营利机构被解雇。
示例:FORM ENTRY – 收集所有信息,提交时触发您的后端作业。
表单条目的RESPONSE – 返回执行redirect到静态等待页面和/或POST / GET到另一个表单(WAIT页面)的HTML。
等待页面 – 只包含与等待页面有关的FORM数据以及JavaScript来销毁最近的历史logging。 像(-1或-2)只能销毁最近的页面,但仍然可以让他们回到原来的FORM入口页面。
一旦他们在你的WAIT页面,他们可以尽可能多地点击REFRESH,并且永远不会在后端产生原始的FORM作业。 相反,您的WAIT页面应该包含META定时刷新,以便始终检查其作业的状态。 当他们的工作完成后,他们会从等待页面转移到任何你想要的地方。
如果他们手动刷新…他们只是在那里再加一个工作状态检查。
希望有所帮助。 祝你好运。
不,没有。
我很确定没有办法拦截从JS的刷新button点击,即使有,JS可以closures。
你应该退出你的X(防止刷新),并find一个不同的解决scheme(不pipe是可能的)。
数字(2) 现在可以通过使用socket.io用户参与每个会话自定义心跳。如果用户试图打开另一个窗口,你有一个JavaScript处理程序与服务器检查,如果没有问题,然后回应带有错误信息。
然而,更好的解决scheme是同步两个会话,如果可能的话,就像在谷歌文档。