2012-07-03 72 views
5

我有一个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(); 
}); 
  • 火狐:正常工作
  • 铬:正常工作时重装但不是当闭合翼片关闭浏览器
  • IE(所有版本):根本不起作用

I wan它可以正确地在所有浏览器中工作,但最重要的是Chrome(我们的用户不是很多都有IE)。

Flash正确地调用了sendRequest(在所有浏览器中都使用警报测试过),所以我不认为这些问题来自Flash,但它可能会发生。

+1

我不认为你可以也不会做我认为你应该依靠.unload,如果用户想关闭浏览器他们想关闭浏览器。如果浏览器等待,您的请求是否需要超过几毫秒才能完成保存?为什么不保存游戏说30秒定时器,以便他们最长时间会出30秒,那么你不必担心卸载事件 – dstarh

+0

@dstarh:我们已经将游戏保存在计时器上。这样做的目的是防止玩家失去最后几秒的行动。通常,这些最后几项行动很重要。 – Fragsworth

+1

所以你说,点击X关闭浏览器窗口的人应该期望他们在过去几秒内完成的所有工作都应该保存下来?我认为培训用户点击一个保存按钮,然后关闭浏览器花费的时间会更多。我们需要让用户摆脱“我把电源线从墙上拔下来,为什么没有一切能够节约!!!” – dstarh

回答

6

简短的答案是,你不能。

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

卸载事件的精确处理已从版本变化到 版本的浏览器。例如,某些版本的Firefox在遵循链接时会触发 事件,但当窗口关闭时不会触发该事件。在 的实际用法中,应在所有支持的浏览器上测试行为, 并与专有的beforeunload事件进行对比。

由于有相关的任务的执行许多潜在的安全问题,当用户要求结束的页面(因此脚本),这将可能是不可靠的,直到(如果)一个严重的标准化努​​力是准确地确定在onbeforeunload回调中可以做些什么。

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

1

尝试window.onbeforeunload。我发现这在jQueryBug Tracker作为一种可能的解决方案:

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