deviceready事件未在基于1.6.1的phonegap构建应用程序中触发

时间:2012-04-28 13:04:32

标签: ios events cordova

背景:

我正在运行一个使用phonegap build(1.6.1)构建的phonegap应用程序。

android build似乎工作正常, 但是在iOS(Iphone 3GS 16M iOS:5.0.1(9A405))上,我从未收到deviceready事件。

我想知道我在这里缺少什么。

问题: 1. deviceready事件在phonegap.js之前或之后的约束是否重要? 可能是事件正在发生而且太早了#34;我的处理程序还没有绑定它? 3.是否有基于轮询的方法来确定设备已准备就绪? 4.在哪里应该完成与JQuery的$(document').ready

相关的设备处理

我的代码: 我当前的代码试图同步3件事: 1. JQuery的.ready事件 2. PhoneGap的deviceready事件 3.(小心)在window.navigator.device.platform

上查询结果

以下列方式:

<!DOCTYPE html>
<html>
<head>

    <script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript" src="./scripts/jquery.myapp.js"></script>

    <script type="text/javascript">
        window.myapp={
            deviceReady:false,
            JQueryReady:false,
            started:false,
            logbuf:[]
        }

        function log(m){
            window.myapp.logbuf.push(m);
            console.debug(window.myapp.logbuf.join('||'));
            var  el=document.getElementById('container');
            if (el!=null) {
                el.innerHTML+=', ' + window.myapp.logbuf.join('||') ;
                window.myapp.logbuf=[];
            }
        }

        //Wait for device
        function onDeviceReady() {
            window.myapp.deviceReady=true;
            log('phonegap deviceready event fired');
            startIfAllReady();
        }
        document.addEventListener("deviceready", onDeviceReady, false);

        function pollDevice(){
            if (window && window.navigator && window.navigator.device && window.navigator.device.platform ) {
                log('polling found device');
                window.myapp.deviceReady=true;
                startIfAllReady();  
            }
            else {
                log('polling');
                window.setTimeout(arguments.callee,500);
            }
        }

        pollDevice();

        //Wait for jquery
        $(document).ready(
            function(){
                window.myapp.JQueryReady=true;
                log('jquery document.ready event fired');
                startIfAllReady();
            }
        );              


        function startIfAllReady(){
            log('startIfAllReady window.myapp.JQueryReady=' + window.myapp.JQueryReady + ' window.myapp.deviceReady=' + window.myapp.deviceReady + ' window.myapp.started=' + window.myapp.started );
            if (window.myapp.deviceReady && window.myapp.JQueryReady && window.myapp.started==false) {
                log('starting');
                started=true;
                renderClient();
            }
            else {
                log('cant start');                  
            }
        }

        function renderClient(){
            log('renderClient called - RETURNING !');
            return;
            window.setTimeout(function(){window.scrollTo(0, 1)},100);
            log('create myappClient');
            $('#myappClientContainer').empty().myappClient(
                {width:$(window).width(),
                 height:$(window).height()
                }
            );
        }

    </script>

    <script type="text/javascript" src="phonegap.js"></script>

    <link rel="stylesheet" type="text/css" href="./styles/client.css" />
    <style>
        html , body { margin:0px; background-color:gray;}
    </style>

    <title>myapp</title>
</script>
</head>
<body style="width:100%">

<script>
    log('body script executing');
</script>
<div style="width:100%" id="myappClientContainer">DEFAULT HTML</div>
</body>
</html>

代码结果: 在一个规则浏览器(chrome)中我得到:

DEFAULT HTML  
polling||body script executing||jquery document.ready event fired  
startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false   
cant start   
polling   
polling   
polling   
... (and polling....)  

在Iphone上:

DEFAULT HTML  
polling||body script executing||jquery document.ready event fired  
startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false   
cant start

正如你所看到的那样 - 没有&#34;电话机设备已启动事件&#34;在任何地方,民意调查似乎也不起作用:(

请注意,在iphone上,只有单一的&#34;轮询&#34;开始时记录条目... iPhone无法处理onTimeout? 为什么我没有得到deviceready事件?!

我注意到的另一件事: 使用调试集构建(phonegap)时, 我可以在PhoneGapBuild我们的调试窗口中看到设备/应用程序很短的时间然后它就会消失。

谢谢

更新: 我上面的轮询循环是错误的, 它应该寻找window.navigator.platform

无论如何,我把它全部丢弃了。 什么东西不起作用。

3 个答案:

答案 0 :(得分:2)

令人惊讶的是,我的问题通过添加解决了     ..script src =“phonegap.js ... 到我的html文件

源: http://community.phonegap.com/nitobi/topics/javascript_events_not_working_with_android_phonegap_build_xcode

我的印象是构建过程添加了ipmort,我特别困惑,因为当我绕过deviceready事件时一切都很好。希望这会有所帮助。

答案 1 :(得分:0)

似乎我忽略了更新这个Q. 无论如何,问题是'console.debug'在酒厂内不存在,所以我的代码失败了。

的Eyal

答案 2 :(得分:-1)

你必须在身体负荷上附上phoneGap deviceReady事件,如下所示:

<script>
function onBodyLoad() {
    document.addEventListener("deviceready", onDeviceReady, false); 
    }
</script>

<body onload="onBodyLoad()"> .. html ... </body>