问题 如何使用angularjs触发关闭窗口的函数


我需要在用户关闭应用程序时执行一个函数,但需要考虑以下几点:

  • 我需要执行一个函数 service, 然后...
  • ...基于纯粹的基于JavaScript的功能不太可能 在这里很有用
  • 当我使用路线时,一个范围 onLocationChangeSuccess 绑定是 没用也没用

因此这个解决方案不起作用: https://stackoverflow.com/a/18355715/773595

因为这会在每次位置更改时触发,但是我需要的是当选项卡/窗口关闭时只有一个触发器。


2085
2018-05-20 09:20


起源

你能告诉我们你试过的一些代码吗? - forgottofly


答案:


您可以在控制器/指令中注册onbeforeunload,然后您就可以访问该范围。如果是服务,我会在angular.run生命周期中注册它。

angular.module('app', [])
  .controller('exitController', function($scope, $window) {
    $scope.onExit = function() {
      return ('bye bye');
    };

   $window.onbeforeunload =  $scope.onExit;
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="exitController">
  <a href="http://www.disney.com">Leave page</a>
</div>


12
2018-05-20 09:41



按预期工作!谢谢 - vdegenne
如果您不必从视图中调用此函数,则无需污染作用域的公共名称空间。请参阅user4919812的解决方案。 - vsp
如何区分浏览器关闭和刷新? - Ben
@Michael,如果直接点击浏览器标签的关闭按钮怎么办? - HP's 411
@Michael,谢谢它对'窗口关闭'工作得很好,但是当我刷新页面然后调用相同的函数时,还有其他解决方案吗? - Vishnu KR


我认为您可以使用$ window在窗口关闭时绑定本机javascript事件 例如

app.controller('myCtrl', ['$window', '$myService', function ($window, $myService) {
  $window.onbeforeunload = function (evt) {
    $myService.onclose();
  }
}]);

6
2018-05-20 09:52



哎呀,看起来迈克尔回答和我的相同
不幸的是,这种方法会触发一些浏览器(即Firefox)的警报 - aguadoe


这项工作?

onbeforeunload,不仅是窗口关闭时触发,也发生在用户刷新窗口时(ctrl + f5)。如果你使用$ window.onunload,函数将永远不会执行,因为在执行函数代码之前窗口将被关闭。


-3
2017-11-17 14:52