如何在phonegap / cordova中检测Android后退按钮

时间:2015-04-16 15:02:44

标签: android jquery cordova jquery-mobile

我目前正在使用cordova 3.7.1。在我的应用程序中,我无法在jquery脚本中检测到硬件后退按钮。我尝试这样: $(document).ready(function() { //registering the back button document.addEventListener("backbutton", onBackKeyDown, false); });

function onBackKeyDown(e) { alert("back button pressed");//alert if the android back button is pressed }

但这不起作用。我已经尝试了所有可能性

我还尝试使用

获取MainActivity.java中的当前URL

appView.getUrl();

但是这不会返回div的url 如果我有一个div作为#page2它没有返回url。

它只返回http://sas.cer.org/index.html。它没有返回http://sas.cer.org/index.html#page2

我也使用jquery mobile。

在Native或Jquery端处理android / hardware后退按钮是否有其他选择?

3 个答案:

答案 0 :(得分:3)

有两种解决方案:

1)你需要在索引html文件的head部分的script标签中包含cordova.js,以使事件和插件工作。

<script type="text/javascript" charset="utf-8" src="cordova.js"></script>

您可能无法在文件夹中看到此文件,但看到了手机屏幕cordova命令在移动设备上运行时构建它。

2)将您的代码修改为given here. 使用特定于移动设备的活动来确保您的应用正常运行。

答案 1 :(得分:1)

以下内容在我们部署到cordova和Web的应用程序中得到了很好的运用。

如果是科尔多瓦,则需要window._cordovaNative = true

我将按钮处理代码留在其中作为示例(请参阅“ // close menu if open”和其他注释),您需要将其替换为代码。

将此放置在某处:

let bNH, bakNavHandler = bNH = {
    warningOpen: false,
    init: function(){
        if (window._cordovaNative)
            document.addEventListener('backbutton', this.onback, false);
        else {
            if (!window.performance || performance.navigation.type != 1)
                this.preventDefault();
            window.onpopstate =  this.onback;
        }
    },
    preventDefault: function(e){
        window._cordovaNative ? 
            e.preventDefault() : 
            window.history.pushState(null, '', window.location.href);
    },
    onback: function(e){
        // close menu if open
        if ($('#ekapp_menu_div').css('margin-right') == '-2px'){
            bNH.preventDefault(e)
            _that.hideMenuDiv();
        }
        // close modal if open
        else if (!bNH.warningOpen && $('#ekapp_modal:visible')[0]){
            bNH.preventDefault(e)
            _that.closeModal();
        }
        // prev screen if history
        else if (_that.history.length > 1) {
            bNH.preventDefault(e)
            _that.previousScreen();
        }
        // show close app warning
        else if (!bNH.warningOpen) {
            if (window._cordovaNative)
                bNH.preventDefault(e);
            _that.openModal('Tap back button again to exit app!');
            bNH.warningOpen = true;
            $('#ekapp_modal_buttons .ekapp_cancel_btn').one('click', function(){
                bNH.warningOpen = false;
                if (!window._cordovaNative)
                    bNH.preventDefault();
            });
        }
    }
};

然后在您的设备就绪(cordova)或doc ready(web)初始化函数中执行以下操作:

bakNavHandler.init();

答案 2 :(得分:0)

阅读文档,您有a full example there

您必须侦听deviceready事件,而不是文档就绪

<!DOCTYPE html>
<html>
  <head>
    <title>Back Button Example</title>

    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script type="text/javascript" charset="utf-8">

    // Wait for device API libraries to load
    //
    function onLoad() {
        document.addEventListener("deviceready", onDeviceReady, false);
    }

    // device APIs are available
    //
    function onDeviceReady() {
        // Register the event listener
        document.addEventListener("backbutton", onBackKeyDown, false);
    }

    // Handle the back button
    //
    function onBackKeyDown() {
    }

    </script>
  </head>
  <body onload="onLoad()">
  </body>
</html>