在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]

Posted

技术标签:

【中文标题】在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]【英文标题】:Run one last Ajax Request on (Back button, forward button, close tab/browser) [duplicate] 【发布时间】:2011-09-18 00:01:11 【问题描述】:

当用户想要编辑任务时,文件会被锁定。当他们保存或点击关闭按钮(从对话框中)时,文件被解锁。

但是,如果用户单击其中任何一个:后退按钮、前进按钮、关闭选项卡/浏览器

文件被锁定。我有一个清理计划程序,可以在 X 分钟后解锁所有文件。

但是我希望能够执行最后一个请求来解锁文件,这样人们就不必等待 X 分钟直到任务自行解锁,因为有人决定关闭他们的浏览器。

我找到了这个

$(window).unload(function ()
    
        alert('unloaded');
    );

但我不知道它支持什么浏览器,也不知道它是否能满足我的要求。

【问题讨论】:

【参考方案1】:
window.onunload = function () 
   // has to be synchronous so the function doesn't return immediately
   $.ajax(
      async: false, 
      ...
   );
;

同步请求不会被看得太高,因为它们会冻结 UI,但如果您想实现 此特定行为,我看不到任何其他方式。不过,我相信您可以通过其他几种方式进行操作,而无需同步请求。

例如,您可以要求用户在尝试关闭窗口时保存文件:

// use beforeunload to prompt the user
window.onbeforeunload = function () 
   if (!saved) 
       return "Please save the task before exiting!";
   
;

此外,大多数浏览器都支持这些事件。不过我认为 Opera 是个例外。

【讨论】:

@CD Sanchez - 使用 window.onbeforeunload 比我发布的 jquery 方式更好吗?以上是否适用于所有浏览器? @chobo2:我相信在将 jQuery 的绑定与卸载事件一起使用时存在某种错误。不确定这是否仍然适用,但使用万无一失的方式不会有什么坏处(除非您需要为特定事件分配多个事件处理程序)。 @CD Sanchez - 我还能把它放入准备好的文档中吗? @chobo2:我认为你不必这样做,因为它不依赖于 DOM。 @chobo2:是的,无论出于何种原因,Opera 都不支持这些事件。如果你真的想要这种行为,我认为你可以忽略 Opera,因为与其他浏览器相比,使用它的人并不多。

以上是关于在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

当我单击浏览器后退按钮或移动设备后退按钮时,保留选定的选项卡

如何使浏览器后退按钮跳过内页导航并返回上一页

后退按钮未触发 Chrome 中“beforeunload”中的方法

求HTML网页点击UE浏览器上的后退按钮后能回到上一次浏览的网页的代码!

如何用jQuery禁用浏览器的前进后退按钮

Javascript/jQuery 仅在浏览器后退/前进按钮单击时检测哈希更改