Javascript 仅当';卸载前';函数返回true
我使用JQuery捕获用户离开页面时的卸载事件。这很好,但我有数据需要保存,只有在用户真的想离开的情况下 这是我的第二十二条军规。如果我过早地保存代码,而用户不想离开,那么我就破坏了支持代码的web服务的状态 因此,我需要完成几乎无法完成的任务,即仅当“beforeunload”对话框返回true时才执行代码Javascript 仅当';卸载前';函数返回true,javascript,html,onbeforeunload,Javascript,Html,Onbeforeunload,我使用JQuery捕获用户离开页面时的卸载事件。这很好,但我有数据需要保存,只有在用户真的想离开的情况下 这是我的第二十二条军规。如果我过早地保存代码,而用户不想离开,那么我就破坏了支持代码的web服务的状态 因此,我需要完成几乎无法完成的任务,即仅当“beforeunload”对话框返回true时才执行代码 $(window).on('beforeunload', function(e) { var info = * some info to save the current page
$(window).on('beforeunload', function(e) {
var info = * some info to save the current page state *
return 'Are you sure you want to navigate away from the Test Runner?';
//unreachable place where I wish I could ajax 'info' back to safety
});
此代码将弹出一个对话框,询问“您确定要离开测试运行程序吗?”如果用户单击“取消”,将阻止用户离开页面
还有一个想法:
$(window).on('onunload', function(e) {
var info = * some info to save the current page state *
var r=confirm('Are you sure you want to stop the Test Runner?');
if(r==true)
{
//place where I wish I could ajax 'info' back to safety
return 'leaving'
}
else
return 'leaving unsaved';
});
第二种方法不会阻止用户以任何方式离开,但在一种情况下,会首先执行一些保存代码,而在另一种情况下,会将它们重新引导到cold中。这种方法的问题在于,由于90年代的网络开发人员多年来对贫穷的拨号上网冲浪者视而不见,大多数浏览器(正确地)阻止确认框在window.onload状态下启动
免责声明:我很清楚,web开发人员社区强烈反对阻止用户离开页面并在后台执行代码。当我看到像“如何防止用户离开我真正棒的网站”这样的问题时,我的下意识反应通常是“不要这样做!”这表示这是不同的。这是一个特定客户的专门页面,我们需要它作为一种恐慌预防措施。我是好人,我保证。我和你一样。试着使用这两个事件。您需要的是同一范围内的共享变量,而不是全局变量<代码>onbeforeunload将在对话框出现之前触发
onunload
仅当用户单击以退出窗口/选项卡时才会被激发
// Use a variable in the same scope of both events:
var savedState;
$(window).on('beforeunload', function(e) {
savedState = "what the user currently made";
return "Sure U are?";
});
$(window).on('unload', function(e) {
// user didn't save!!
// your auto-save function:
auto_save(savedState);
// browser leaves this tab.
});
作为作用域,我指的是类似于
(function(){})()的东西代码>或任何其他(构造函数或函数)函数。已在chrome中测试和使用
$(window).on('beforeunload', function () {
return 'Are you sure you want to navigate away from the Test Runner?';
});
$(window).on('unload', function () {
$.ajax({ url: '/default.aspx', async: false });
});
刚刚遇到你现在的经历
下面的链接是这个问题的一个很好的参考
“该文件处于特定状态:
- 所有资源仍然存在(img、iframe等)
- 最终用户再也看不到任何内容
- UI交互无效(窗口打开、警报、确认等)
- 错误不会停止卸载工作流“
因此,在beforepageunload之后,您将无法触发任何内容,因为它不会产生任何返回值那么,定期以小批量/后台保存的方式保存数据怎么样?这样,您只需在上面的事件处理程序中调用save()。类似于您键入时gmail在草稿文件夹中临时保存电子邮件的方式。加上一个是一个好主意,但不幸的是,在这种情况下不是一个选项。在chrome、firefox和ie10-7上也进行了测试。投票支持你,因为你做对了,但我会接受metadings的回答,因为它对我的应用程序更为具体。它正在刷新页面,但当我关闭选项卡时,自动保存功能不会调用。