【问题标题】:How to make a cross-browser on-window-unload request?如何发出跨浏览器的窗口卸载请求?
【发布时间】:2012-07-04 06:40:30
【问题描述】:

我有一个 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();
});
  • Firefox:正常工作
  • Chrome:重新加载时正常工作,但关闭标签页关闭浏览器时不能正常工作
  • IE(所有版本):根本不工作

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

Flash 正确调用了 sendRequest(在所有浏览器中,都通过警报进行了测试),所以我不认为问题来自 Flash,但它可能。

【问题讨论】:

  • 如果用户想要关闭浏览器,我认为您不能也不认为您应该依赖 .unload。如果浏览器等待,您的请求是否应该花费超过几毫秒的时间来保存?为什么不将游戏保存在一个 30 秒的计时器上,这样他们最长的退出时间是 30 秒,那么您就不必担心卸载事件
  • @dstarh:我们已经在计时器上保存了游戏。这样做的目的是防止玩家失去最后几秒钟的动作。通常,最后几个动作很重要。
  • 所以你是说点击X关闭浏览器窗口的人应该期望他们在过去几秒钟内所做的一切都应该被保存?我认为训练用户点击保存按钮然后关闭浏览器是更好的时间。我们需要让用户摆脱“我从墙上拔了电源线,为什么没有全部保存??????!!!”的心态
  • 使用window.onbeforeunload与stackoverflow.com/questions/10616437/…>

标签: javascript jquery flash onbeforeunload


【解决方案1】:

简短的回答是你不能。

onbeforeunload 事件最初由 Microsoft 引入,以允许标准确认对话框。现在大多数浏览器都以原始形式支持它,并且在大多数情况下,允许执行一个简短的、非交互式的函数(例如,您可以在 localStorage 中记录您的状态)。但是,正如the cross-browser jQuery API 中所述,这是不可靠的:

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

由于当用户要求结束页面(以及脚本)时,与执行任务相关的许多潜在安全问题,这可能是不可靠的,直到(并且如果)进行严格的规范化工作以精确在onbeforeunload 回调中究竟可以做什么。

为了可预见的未来,建议不要依赖onbeforeunload,而是使用其他方案,例如持续后台保存或大的“保存”按钮。

【讨论】:

    【解决方案2】:

    试试window.onbeforeunload。我在jQueryBug Tracker 中发现了这个可能的解决方案:

    window.onbeforeunload = function() { return "text"; }
    

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 2011-06-13
      • 2015-01-19
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2011-01-10
      • 2019-06-15
      相关资源
      最近更新 更多