防止Web浏览器关闭,直到返回AJAX响应为止
我有一个在网络浏览器中运行的游戏(作为插件),我想要做的是:
-
检测用户是否已决定关闭浏览器(Alt + F4,点击“X”按钮等)
-
当我们触发对Web服务的调用以记录用户已关闭浏览器时,阻止浏览器关闭
-
一旦我们收到来自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这样的东西,但是这些框架都有生命周期方法,在正常关机的情况下会在你的插件上调用,所以你应该可以写一些东西到记录此时。 如果插件崩溃,则不会调用这些插件。