防止Web浏览器关闭,直到返回AJAX响应为止

我有一个在网络浏览器中运行的游戏(作为插件),我想要做的是:

  1. 检测用户是否已决定关闭浏览器(Alt + F4,点击“X”按钮等)

  2. 当我们触发对Web服务的调用以记录用户已关闭浏览器时,阻止浏览器关闭

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

我们想要做到这一点的主要原因是我们遇到了一些并发问题,并且通过我们的日志,我们希望将登出/关闭浏览器的人与插件崩溃的真实实例隔离开来。

我看着用JQuery做这个(对于X-Browser兼容性 – Opera无法工作,但我们还没有任何用户在Opera上谢天谢地):

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

问题是这会向用户显示一个确认对话框(’您确定要离开此页面’),用户可能会在发送AJAX呼叫之前确认该对话框。

所以问题是,有没有办法阻止浏览器关闭,直到收到响应? 当页面也被更改时,’beforeunload’也会触发 – 有没有办法区分点击链接实际点击关闭?

感谢任何对此的帮助!

它的棘手业务是避免浏览器窗口关闭。 实际上,除了从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; }); 

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

对于第二个问题,通过jQuery区分链接上的点击与触发onbeforeunload事件的其他事件相当容易:

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

例如,您可以使用它来确保单击不会触发unbeforeunload

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

您可以使用以下代码来阻止浏览器关闭: –

 window.onbeforeunload = function() { //Your code goes here. return ""; } 

现在,当用户关闭浏览器时,由于返回“”,他将获得确认对话框; 等待用户确认,此等待时间使请求到达服务器。

我很确定你想要的东西是不可能使用JavaScript的。 但是,由于你有一个浏览器插件,你不应该检查你的插件对象是否被正确清理? 我不确定你是使用ActiveX,NPAPI还是像Firebreath这样的东西,但是这些框架都有生命周期方法,在正常关机的情况下会在你的插件上调用,所以你应该可以写一些东西到记录此时。 如果插件崩溃,则不会调用这些插件。