如何进行跨浏览器的窗口卸载请求?

Fra*_*rth 5 javascript flash jquery onbeforeunload

我有一个Flash游戏,我试图保存用户关闭浏览器选项卡时的状态.它使用以下jquery代码:

//Called from Flash when window closes
function sendRequest(url, params) {
    $.ajax({
      type: "POST",
      async: false,
      url: url,
      data: params
    })
}

$(window).unload(function() {
  //Make Flash attempt to save the game when the window closes.
  //Flash gets the necessary data and calls sendRequest()
  document["flashGame"].saveBeforeUnload();
});
Run Code Online (Sandbox Code Playgroud)
  • Firefox:正常工作
  • Chrome:重新加载时正常工作,但关闭选项卡关闭浏览器时不能正常工作
  • IE(所有版本):根本不起作用

我希望它能在所有浏览器中正常工作,但最重要的是Chrome(我们的用户中没有很多人拥有IE).

Flash正在调用sendRequest(在所有浏览器中,通过警报测试),所以我不相信问题来自Flash,但它可能会.

Den*_*ret 6

简短的回答是,你做不到.

onbeforeunload事件最初是由微软推出允许一个标准的确认对话框.大多数浏览器现在支持原始形式,并且在大多数情况下允许执行简短的非交互式功能(例如,您可以在localStorage中记录您的状态).但是,如跨浏览器jQuery API中所述,这是不可靠的:

卸载事件的确切处理因浏览器的版本而异.例如,某些版本的Firefox会在跟踪链接时触发事件,但不会在窗口关闭时触发.在实际使用中,应该在所有支持的浏览器上测试行为,并与专有的beforeunload事件进行对比.

由于当用户要求结束页面(以及脚本)时,有许多与执行任务相关的潜在安全问题,这可能是不可靠的,直到(以及如果)进行严格的规范化工作以确切地确定在onbeforeunload回调中完成.

对于可预测的未来,建议不要依赖onbeforeunload但使用其他方案,例如恒定背景保存或大"保存"按钮.