Выполнить вызов во время события onbeforeunload - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно отправить запрос DELETE, чтобы разблокировать элемент, используемый на странице, когда браузер закрывается; для этого я использовал onbeforeunload (браузеры, поддерживаемые спецификациями - это только Chrome и Firefox).

Если я использую метод возврата, он показывает всплывающее сообщение и вызов работает нормально.

Но, к сожалению, спецификации, необходимые, чтобы избежать этого всплывающего сообщения; в этом случае, когда браузер закрыт, иногда он работает, а иногда нет.

Точнее, у меня есть эти случаи:

  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) с использованием onunload или onclose вместо onbeforeunload

2) с этим ответом https://stackoverflow.com/a/26275621/8879273 мне удалось перехватить событие key, но если окно закрыто мышью, оно не работает (также каждый раз, когда я перемещаю курсор на элемент, который он запускает Удалить вызов)

Я пытался изменить триггер мыши с помощью

$(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 не завершается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...