Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在返回AJAX响应之前阻止web浏览器关闭_Javascript_Jquery_Browser - Fatal编程技术网

Javascript 在返回AJAX响应之前阻止web浏览器关闭

Javascript 在返回AJAX响应之前阻止web浏览器关闭,javascript,jquery,browser,Javascript,Jquery,Browser,我有一个在web浏览器中运行的游戏(作为插件),我正在尝试做的是: 检测用户是否已决定关闭浏览器(Alt+F4,点击“X”按钮等) 在我们调用web服务记录用户已关闭浏览器时,防止浏览器关闭 一旦我们收到来自web服务的响应,释放锁并允许浏览器根据请求关闭 我们这样做的主要原因是我们遇到了一些并发性问题,通过查看我们的日志,我们希望将注销/关闭浏览器的用户与插件崩溃的真实实例隔离开来 我研究了使用JQuery来实现这一点(为了X浏览器的兼容性,Opera无法工作,但无论如何我们没有Opera用户

我有一个在web浏览器中运行的游戏(作为插件),我正在尝试做的是:

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

  • 在我们调用web服务记录用户已关闭浏览器时,防止浏览器关闭

  • 一旦我们收到来自web服务的响应,释放锁并允许浏览器根据请求关闭

  • 我们这样做的主要原因是我们遇到了一些并发性问题,通过查看我们的日志,我们希望将注销/关闭浏览器的用户与插件崩溃的真实实例隔离开来

    我研究了使用JQuery来实现这一点(为了X浏览器的兼容性,Opera无法工作,但无论如何我们没有Opera用户,谢天谢地):

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

    所以问题是,有没有办法防止浏览器在收到响应之前关闭?当页面发生更改时,也会触发“beforeunload”命令-是否有办法区分单击链接和实际单击关闭


    感谢您对此的帮助

    我非常确定,使用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 "";
    }