10

我正在构建一个 PhoneGap 应用程序。不幸的是,当部署到 iOS 设备和模拟器时,该deviceready事件永远不会触发。我正在使用 Phonegap 2.2.0。

当我将相同的代码部署到 Android(cordova.js当然使用 Android 特定文件)时,应用程序将完美运行。

当我将 jQuery 替换deviceready为 jQuery 时ready(),该应用程序也将在 iOS 上加载,但它将无法访问特定于设备的 API。

cordova.js加载,因为我将看到一条简单的警报消息,我将其放入其中,但deviceready从未触发且 API 从未公开。

我的 HTML head

<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> <!-- yes it is the iOS version -->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/app.js"></script>

我的 JS:

function doStuff(){
//app functionality
}
document.addEventListener('deviceready', doStuff, false);

但不知何故,事情只会在Android上完成......

4

5 回答 5

10

在我的 html 中,我有一个 onload 触发将事件侦听器添加到 deviceready

      function onDeviceReady() {
        console.log("we are an app");
        MyApp.initialize_phonegap();
      }

      function onBodyLoad() {   
        document.addEventListener("deviceready", onDeviceReady, false);
      }

    </script>

  </head>

  <body onload="onBodyLoad()">
于 2012-11-04T02:31:14.850 回答
4

为了增加 olore 的答案,我最终使用了默认项目中的代码(从脚本构建)使用的方法(这与Event docs./create中的代码不同)。

主要区别是(我真的不知道实际上要考虑其中哪一个):

  • cordova-2.2.0.js位于根文件夹中
  • <script>s 包含在结束</body>标记之前,而不是文档的head
  • deviceready-处理工作如下:

    var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicity call 'app.receivedEvent(...);'
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
        myApp.start(); //this is where I put the call to my App's functionality relying on device APIs
    },
    // Update DOM on a Received Event
    receivedEvent: function(id) { // I didn't really use this, yet I left it in here as it's in the demo
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');
    
        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');
    
        console.log('Received Event: ' + id);
    }
    };
    
  • 最后一个<script>标签只是调用app.initialize()

这似乎在 iOS 和 Android 上工作得很好,并且比文档中嵌套的双处理程序更容易理解。

于 2012-11-05T11:22:27.850 回答
1

如果您在cordova.js之前之后添加deviceready侦听器,这似乎会有所不同:

我找不到任何关于此的文档,但 cordova.js 拦截了对 addEventListener + removeEventListener 的调用,并且只调用了在 cordova.js之前添加的 deviceready 回调。

我的解决方案只是重新排列脚本顺序:

<script>
document.addEventListener('deviceready', ...)
</script>
<script src="cordova.js"></script>
于 2014-08-07T16:39:35.440 回答
0

我发现如果你不小心包含了两次 cordova.js 脚本,那么 deviceready 事件就不会触发。

于 2014-04-19T12:24:19.343 回答
0

我遇到了同样的问题。我通过添加设备插件让它工作。

$ cordova plugin add org.apache.cordova.device

核实:

$ cordova plugin ls
于 2014-08-21T18:50:28.703 回答