2012-01-05 74 views
7

我有一个在Web浏览器中运行的游戏(如插件)和我想要做的是:从关闭到AJAX响应防止网页浏览器返回

  1. 检测,如果用户已决定关闭浏览器(按Alt + F4,击中的“X”按钮等)从关闭

  2. 防止浏览器,而我们火到我们的网络服务的调用来记录用户已经关闭了浏览器

  3. 一旦我们收到来自Web服务的响应,释放锁并允许浏览器按要求关闭。

我们想这样做的主要原因是,我们有一些并发问题,并通过我们的记录,我们要隔离的人注销/从哪里插件已崩溃真正的情况下关闭浏览器去。

我看着使用jQuery做这个(为X浏览器的兼容性 - Opera将无法正常工作,但我们不会对任何歌剧反正用户谢天谢地):

$(window).bind('beforeunload', function(e) { 
    e.preventDefault(); 
    // make AJAX call 
}); 

的问题是,该显示器向用户发送一个确认对话框('你确定要离开这个页面'),用户可以在发送AJAX呼叫之前确认该对话框。

所以问题是,有没有办法阻止浏览器关闭,直到收到响应?当页面被改变时'beforeunload'也会被触发 - 是否有一种区分点击链接和实际点击关闭的方法?

感谢任何帮助!

+0

只是出于好奇......如果交换“preventDefault”和“make ajax call”部分,是否有区别? – hugomg 2012-01-05 13:34:54

回答

6

它的棘手的业务,以避免浏览器窗口beeing关闭。实际上,没有办法这样做,除了返回onbeforeunload事件的非undefined值之外,就像您所描述的那样。

我可以提出一个可能的建议,那就是在onbeforeunload事件中创建一个同步的 ajax请求。例如,

window.onbeforeunload = function() { 
    $.ajax({ 
     url: '/foo', 
     type: 'GET', 
     async: false, 
     timeout: 4000 
    }); 
}; 

理论上,这会阻止浏览器最多4秒。实际上,浏览器会以不同的方式对待它。例如,Firefox(我在9上测试过它)确实不会立即关闭窗口,但它也不会考虑那里的超时值。我猜在请求被取消之前,窗口/选项卡被关闭之前,内部最大值为2秒。不过,在大多数情况下,我认为这应该足够了。

您的其他问题(如何区分单击链接)很简单。如上所述,onbeforeunload看起来是从它的事件处理程序返回的。所以,让我们假设我们有一个变量,它是对我们的应用全球,我们可以做这样的事情

var globalIndicator = true; 

// ... lots of code 

window.onbeforeunload = function() { 
    return globalIndicator; 
}; 

在这一点上,我们总是收到一个确认对话框时,窗口/标签即将关闭掉。如果我们想避免任何锚点击,我们可以修补它像

$('a[href^=http]').on('click', function() { 
    globalIndicator = undefined; 
}); 
+0

感谢Andreas的输入;所以实际上没有办法阻止浏览器关闭,直到收到响应为止......问题是如果播放器连接速度慢, 2秒可能不足以拨打电话。感谢您对区分点击链接的解释 - 最有帮助 – csdev86 2012-01-05 14:44:42

+0

如果您考虑如何使用它,很明显,没有浏览器会在关闭之前允许任意长时间阻止页面。如果可能的话,有人可以制作一个用户无法关闭的弹出式广告。 – smorgan 2012-01-05 15:11:28

0

我敢肯定,你想要的是不可能使用JavaScript。但既然你有一个浏览器插件,你不应该能够检查你的插件对象是否被正确清理?我不确定你是否使用ActiveX,NPAPI或类似Firebreath的东西,但是这些框架都有生命周期方法,在正常关闭的情况下,你的插件会被调用,所以你应该可以写一些东西给记录在这一点上。如果插件崩溃,这些将不会被调用。

+0

我们无法可靠地从插件调用这个事实,这就是为什么开始从Web浏览器开始考虑的原因。 – csdev86 2012-01-05 14:59:43

1

至于你的问题的第一部分,有阻止浏览器关闭除使用window.onbeforeunload没有可靠的方法。浏览器在那里为用户提供服务,如果用户选择关闭他的浏览器,那么它会这样做。

关于第二个问题,这是相当容易区别于其他事件链接的点击触发onbeforeunload事件的jQuery:

$('a').click(function(e) {...}); 

您可以使用此功能,例如,以确保点击不会触发unbeforeunload

$('a').click(function(e) {window.onbeforeunload = null}); 
1

您可以使用下面的代码,以防止浏览器越来越封闭: -

window.onbeforeunload = function() { 

//Your code goes here. 

    return ""; 
} 

现在,当用户关闭浏览器,然后他得到确认对话,因为返回“”; &等待用户确认&该等待时间使请求到达服务器。

相关问题