Мне нужно отправить запрос DELETE, чтобы разблокировать элемент, используемый на странице, когда браузер закрывается; для этого я использовал onbeforeunload
(браузеры, поддерживаемые спецификациями - это только Chrome и Firefox).
Если я использую метод возврата, он показывает всплывающее сообщение и вызов работает нормально.
Но, к сожалению, спецификации, необходимые, чтобы избежать этого всплывающего сообщения; в этом случае, когда браузер закрыт, иногда он работает, а иногда нет.
Точнее, у меня есть эти случаи:
- Одно окно с заблокированным элементом.
- Больше окон одного и того же браузера с заблокированным элементом в одном из них, и тот же элемент отображается только в других.
- В одном окне браузера отображается заблокированный элемент, а в одном или нескольких окнах другого браузера - тот же элемент.
Когда я закрываю окно с заблокированным элементом, вызов разблокирует его, поэтому, если я обновляю одну из страниц, где отображался тот же элемент, это может быть использовано.
Вот что происходит с текущим «решением»:
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
не завершается.