Javascript 在onbeforeunload中使用Ajax自动保存字段数据

Javascript 在onbeforeunload中使用Ajax自动保存字段数据,javascript,synchronous,onbeforeunload,autosave,Javascript,Synchronous,Onbeforeunload,Autosave,我试图在window.onbeforeuload函数中使用AJAX自动保存我站点页面上的文本字段(没有保存按钮,都是在后台完成的)。保存函数是用PHP编写的。我开始尝试以下方法: window.onbeforeunload = function(e){ var noteelement = document.getElementById( 'note' ); var mynote = noteelement.value; $.post('save_my_note.php', { th

我试图在window.onbeforeuload函数中使用AJAX自动保存我站点页面上的文本字段(没有保存按钮,都是在后台完成的)。保存函数是用PHP编写的。我开始尝试以下方法:

window.onbeforeunload = function(e){
  var noteelement = document.getElementById( 'note' );
  var mynote = noteelement.value;

  $.post('save_my_note.php', { thenote: mynote }, function(data){});
  };
在研究过程中,我逐渐了解到,由于ajax调用的异步性质,php代码不会被调用,因为窗口在函数从服务器启动之前关闭

当然,正如其他人所说,如果我向onbeforeunload函数添加一个返回值以使对话框弹出(即“您确定要离开”对话框),它确实可以工作,因为.post调用在对话框等待响应时有时间运行:

  $.post('save_my_note.php', { thenote: mynote }, function(data){});
  return mynote;
  };
有人说,我必须将此post调用更改为异步AJAX,以便函数等待函数完成,但由于我对语法不是很精通,我不太确定我需要的语法。我尝试了以下方法来代替post功能:

        $.ajax({
            url: "save_my_note.php",
            data: "{thenote: mynote}",
            async: false                 
        });
然而,这似乎也不起作用


有没有人有一个简单的代码示例,可以通过onbeforeunload(或onunload???)函数以同步方式实现autosave?我不是javascript或jquery专家,我在网上找到的例子令人困惑

也许你可以强制暂停超时-不知道这是否真的有效,只是猜测一下:

var bSaved = false;
window.onbeforeunload = function(e){
  bSaved = false;
  var noteelement = document.getElementById( 'note' );
  var mynote = noteelement.value;

  $.post('save_my_note.php', { thenote: mynote }, function(data){ bSaved = true; });

  window.setTimeout('bSaved = true',2000);

  while (!bSaved) {}

  };

您的上一个示例应该可以运行,您需要将
asynch:false
更改为
async:false
(必须删除额外的h

您的意思是在上一个代码段中键入
async:false
?请参阅此问题以获得答案:请注意,在移动浏览器中不会触发OnBeforeLoad,因此,如果你是为了迎合移动市场的需求,那么你可能必须以不同的方式处理问题。我已经读到,将其更改为ajax并使用async:true应该会导致服务器端代码暂停,等待完成后再继续,但我无法让它工作。超时充其量只是偶然的,它会在我所有的页面关闭之前增加一个强制性的等待时间。这不是我必须输入的时间,而是一个最大超时时间。一旦服务器返回,页面将立即卸载,或在两秒钟内卸载,以先到者为准。@MattH超时(和成功回调)将永远不会被触发,因为它将永远卡在while循环中。