AngularJS 中的移动后退按钮与 Cordova/PhoneGap 不起作用

Posted

技术标签:

【中文标题】AngularJS 中的移动后退按钮与 Cordova/PhoneGap 不起作用【英文标题】:Mobile backbutton in AngularJS with Cordova/PhoneGap not working 【发布时间】:2015-04-10 12:01:16 【问题描述】:

我正在使用 Cordova/PhoneGap 开发我的第一个 android AngularJS 移动应用程序。我在脚本文件中添加了以下代码,但无法捕获后退按钮事件。这是我的 scripts.js 中的内容:

  var app = angular.module('QFA', []);

  app.controller('QFAinit', function( $scope, $window ) 

          document.addEventListener("deviceready", onDeviceReady(), false);

          function onDeviceReady() 

            $window.alert("Device Ready-1");
            document.addEventListener("backbutton", onBackKeyDown, false);
            $window.alert("Device Ready-2");

            function onBackKeyDown() 
              $window.alert("Inside onBackKeyDown1");
            
         
  );

我这样称呼它:

  <body ng-controller="QFAinit">

当我运行应用程序时,我确实收到“设备就绪 1”和“设备就绪 2”警报。这意味着 deviceready 事件被正确触发,并且还尝试了后退按钮。但是,当我按下后退按钮时,没有任何反应,而是执行默认行为,即应用程序退出。

另一方面,如果我在 eventlistener 命令上将 onBackKeyDown 替换为 onBackKeyDown(),那么我会在加载应用程序时收到“Inside onBackKeyDown1”警报,就在上述两个警报之后。但是一旦加载了应用程序,后退按钮功能就不存在了。

我怎样才能做到这一点?

更新

我意识到我需要包含 cordova.js 来捕获后退按钮。一旦我添加了它,后退按钮就会被困住。但是,结果我得到了一个损坏的应用程序,如下所示:

我还尝试将 jQuery 的版本从 2.1 更改为 1.11、1.10 和 1.4.5,但这没有任何影响。事实上,即使我删除了 jQuery,我仍然会得到损坏的界面。

【问题讨论】:

括号是始终显示还是仅在您按下后退按钮时显示?您的控制台中有错误,我建议您安装 Eclipse 以从 logcat 中读取,这样您就可以知道您的应用程序出了什么问题。 如果我添加cordova.js,它们总是会显示。当 cordova.js 被删除时,它们就会消失。 Eclipse.....另一个学习练习:-( 【参考方案1】:

如果我提醒正确,移动设备上的警报框是异步的。该应用程序可能没有时间显示警报框,因为它已经关闭。如果您执行console.log,您可以在 Eclipse logcat 中阅读它吗?或者如果你做了一个阻止默认设置,它应该阻止关闭应用程序:

 function onBackKeyDown(event) 
     event.preventDefault();
     $window.alert("Inside onBackKeyDown1");
 

【讨论】:

警报必须停止所有正在运行的东西。它曾经与我使用 PhoneGap+JQueryMobile 构建的以前版本的应用程序一起使用。我正在使用 PhoneGap 在 AngularJS 中重新开发相同的应用程序,但它在这里不起作用。我认为使用最新的 Cordova 不再需要 preventDefault。但我也试过了,但没有成功。抱歉,我没有使用 Eclipse 并在命令行上工作。 Mobile 和 Ripple Emulator 中的行为相同。 请参阅上面的更新。谢谢@Ricconnect【参考方案2】:

以下是最终对我有用的方法,将所有这些放在部分中。虽然它也适用于身体。不再是控制器了。

  <link rel="stylesheet" href="js/bootstrap.min.css">
  <link rel="stylesheet" href="js/bootstrap-theme.min.css">

  <script src="js/jquery-1.11.2.min.js"></script>
  <script src="cordova.js"></script>        

  <script>
     document.addEventListener("deviceready", onDeviceReady(), false);

     function onDeviceReady() 

       document.addEventListener("backbutton", onBackKeyDown, true);

     

     function onBackKeyDown() 
        alert('Back Button Pressed');
        resp = confirm("If you use Home key to exit, the App will remain active. Still want to Quit?");
        if (resp === true) 
          navigator.app.exitApp();
        
     
   </script>

  <script src="js/angular.min.js"></script>
  <script src="js/angular-resource.min.js"></script>
  <script src="js/bootstrap.min.js"></script>
  <script type="text/javascript" src="app.js"></script>

【讨论】:

以上是关于AngularJS 中的移动后退按钮与 Cordova/PhoneGap 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 AngularJS/Javascript 仅禁用浏览器后退按钮导航(不是应用程序中的链接)

如何让后退按钮与 AngularJS ui-router 状态机一起使用?

当我单击浏览器后退按钮或移动设备后退按钮时,保留选定的选项卡

使用浏览器后退按钮时,我的应用程序中的标题不会改变

Flutter 中的设备后退按钮覆盖

Angular js-模拟浏览器后退/前进按钮禁用