在onbeforeunload事件期间执行呼叫

时间:2018-11-15 12:01:32

标签: javascript session browser

关闭浏览器时,我需要发送一个DELETE请求来解锁页面中使用的项目;为此,我使用了onbeforeunload(规范支持的浏览器仅为Chrome和Firefox)。

如果我在方法上使用return,则会显示一条弹出消息,并且调用正常。

但是,不幸的是,避免出现此弹出消息所需的规范;在这种情况下,当浏览器关闭时,有时它可以工作,有时则不能。

更具体地说,我遇到了以下情况:

  1. 具有锁定项目的单个窗口。
  2. 同一浏览器的更多窗口中有一个处于锁定状态,而在其他浏览器中仅显示同一窗口。
  3. 浏览器的一个窗口带有锁定的项目,另一个浏览器的一个或多个窗口显示相同的项目。

当我关闭带有锁定项目的窗口时,调用会对其进行解锁,因此,如果刷新显示相同项目的页面之一,则可以使用。

这是当前“解决方案”所发生的情况:

Firefox:
- Case 1: doesn't unlock the item.
- Case 2: unlock the item.
- Case 3: doesn't unlock the item.

Chrome:
- Case 1: doesn't unlock the item.
- Case 2: unlock the item.
- Case 3: unlock the item.

当前实现为:

$window.onbeforeunload = function(){
    MyService.delete({id: item.id});    //The service is defined on another .js
}

其他无效的解决方案:

1)使用onunloadonclose代替onbeforeunload

2)这个答案https://stackoverflow.com/a/26275621/8879273是我设法拦截按键事件,但是如果用鼠标关闭了窗口,则它不起作用(而且,每次我将光标移到该项目上时,它都会启动一个删除通话)

我尝试用更改鼠标触发器

$(window).on('click', (function () {        
    window.onbeforeunload = MyService.delete({ id: item.id });
}));

$(window).on('mousedown', (function () {
    window.onbeforeunload = MyService.delete({ id: item.id });
}));

但是它仍然不起作用

3)使用延期

$window.onbeforeunload = function (event) {
    $scope.closing();
}

$scope.closing = function(){
    var deferred = $q.defer();
    MyService.delete({ id: item.id }).then(function(response){
        deferred.resolved(response);
    }, function(error){
        deferred.resolved(error);
    });
    return deferred.promise;
}

4)无奈之下,我已经写了这个( 不要尝试:它可以正常工作...如果您想锁定整个计算机!

$scope.unlocking = false;

$window.onbeforeunload = function(){
    MyService.delete({id: item.id}).then(function(response){
        $scope.unlocking = true;
    }, function(error){
        $scope.unlocking = true;  // it doesn't matter if is a successful response or not
    });

    // since call are async, i've thinked to put a while to wait the response

    var res = angular.copy($scope.unlocking);
    while(res){
        $timeout(function(){
            res = angular.copy($scope.unlocking);
        }, 100);
    }
}

此代码存在的问题是响应返回但while没有退出。

0 个答案:

没有答案