Javascript 在返回AJAX响应之前阻止web浏览器关闭
我有一个在web浏览器中运行的游戏(作为插件),我正在尝试做的是:Javascript 在返回AJAX响应之前阻止web浏览器关闭,javascript,jquery,browser,Javascript,Jquery,Browser,我有一个在web浏览器中运行的游戏(作为插件),我正在尝试做的是: 检测用户是否已决定关闭浏览器(Alt+F4,点击“X”按钮等) 在我们调用web服务记录用户已关闭浏览器时,防止浏览器关闭 一旦我们收到来自web服务的响应,释放锁并允许浏览器根据请求关闭 我们这样做的主要原因是我们遇到了一些并发性问题,通过查看我们的日志,我们希望将注销/关闭浏览器的用户与插件崩溃的真实实例隔离开来 我研究了使用JQuery来实现这一点(为了X浏览器的兼容性,Opera无法工作,但无论如何我们没有Opera用户
感谢您对此的帮助 我非常确定,使用JavaScript不可能实现您想要的功能。但是既然你有一个浏览器插件,你就不能检查你的插件对象是否被正确清理了吗?我不确定您是否正在使用ActiveX、NPAPI或类似Firebreath的东西,但这些框架都有生命周期方法,在正常关机的情况下会在插件上调用这些方法,因此此时您应该能够在日志中写入一些内容。如果插件崩溃,这些将不会被调用。避免浏览器窗口关闭是一件棘手的事情。实际上,除了从
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;
});
至于问题的第一部分,除了使用外,没有可靠的方法阻止浏览器关闭。浏览器是为用户服务的,如果用户选择关闭浏览器,它就会这样做 对于第二个问题,jQuery很容易将点击链接与触发
onbeforeunload
事件的其他事件区分开来:
$('a').click(function(e) {...});
例如,您可以使用此选项来确保单击不会触发卸载前的unbeforeunload
:
$('a').click(function(e) {window.onbeforeunload = null});
您可以使用以下代码防止浏览器关闭:-
window.onbeforeunload = function() {
//Your code goes here.
return "";
}
现在,当用户关闭浏览器时,由于返回“”;&等待用户确认&这段等待时间使请求到达服务器。只是出于好奇。。。如果您交换“preventDefault”和“makeAjax调用”部分,会有什么不同吗?感谢Andreas的输入;因此,在收到响应之前,实际上无法阻止浏览器关闭。。。问题是如果播放器连接速度慢;2秒的时间可能不足以打电话。感谢您对点击链接之间的区别所作的解释——最有帮助的是,如果您考虑一下如何使用链接,很明显,任何浏览器都不会允许页面在关闭之前阻塞任意长的时间。如果可能的话,比如说,有人可以制作一个用户永远无法关闭的弹出式广告。我们无法从插件可靠地进行调用,这就是我们开始考虑从web浏览器进行调用的原因。
window.onbeforeunload = function() {
//Your code goes here.
return "";
}