Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅当';卸载前';函数返回true_Javascript_Html_Onbeforeunload - Fatal编程技术网

Javascript 仅当';卸载前';函数返回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

我使用JQuery捕获用户离开页面时的卸载事件。这很好,但我有数据需要保存,只有在用户真的想离开的情况下

这是我的第二十二条军规。如果我过早地保存代码,而用户不想离开,那么我就破坏了支持代码的web服务的状态

因此,我需要完成几乎无法完成的任务,即仅当“beforeunload”对话框返回true时才执行代码

$(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的回答,因为它对我的应用程序更为具体。它正在刷新页面,但当我关闭选项卡时,自动保存功能不会调用。