2

バックグラウンド:

phonegap build(1.6.1)を使用してビルドしているphonegapアプリを実行しています。

androidビルドは問題なく動作しているようですが、iOS(iPhone 3GS 16M iOS:5.0.1(9A405))ではdevicereadyイベントが発生しません。

私はここで何が欠けているのかを理解しようとしています。

deviceready質問:1。イベントのバインドがインクルードの前か後かは重要phonegap.jsですか?2.イベントが「早すぎて」発生していて、ハンドラーがまだそれにバインドされていない可能性がありますか?3.デバイスの準備ができていることを確認するためのポーリングベースの方法はありますか?4. JQueryに関連してdevicereadyの処理はどこで行う必要があり$(document').readyますか?

私のコード:私の現在のコードは3つのことを同期しようとしています:1。JQueryの.readyイベント2.PhoneGapのイベント3.window.navigator.device.platformでのdeviceready(注意深い)ポーリング結果

次のように:

<!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>

コードの結果:通常のブラウザー(クロム)で次のようになります。

デフォルトのHTML  
ポーリング||bodyスクリプトの実行||jquerydocument.readyイベントが発生しました  
startIfAllReady window.myapp.JQueryReady = true window.myapp.deviceReady = false window.myapp.started = false   
開始できません   
ポーリング   
ポーリング   
ポーリング   
...(およびポーリング....)  

iPhoneで:

デフォルトのHTML  
ポーリング||bodyスクリプトの実行||jquerydocument.readyイベントが発生しました  
startIfAllReady window.myapp.JQueryReady = true window.myapp.deviceReady = false window.myapp.started = false   
開始できません

ご覧のとおり、「phonegap devicereadyイベントが発生した」ことはなく、ポーリングも機能していないようです:(

iPhoneでは、開始時に1つの「ポーリング」ログエントリのみが...iPhoneがonTimeoutを処理できないことに注意してください。なぜdevicereadyイベントを取得しないのですか?!

私が気付いたもう1つのことは、デバッグセットを使用して(phonegap)ビルドすると、PhoneGapBuildのデバッグウィンドウにデバイス/アプリが短時間表示され、その後消えてしまうことです。

ありがとう

更新:上記のポーリングループが間違っています。window.navigator.platformを探す必要があります

とにかく私はそれをすべて一緒に落としました。何かが機能していないだけです。

4

3 に答える 3

2

驚いたことに、私の問題は、htmlファイルに..script src ="phonegap.js...を追加することで解決しました。

ソース: http ://community.phonegap.com/nitobi/topics/javascript_events_not_working_with_android_phonegap_build_xcode

私はビルドプロセスがそのipmortを追加したという印象を受けました、そして私がdevicereadyイベントをバイパスしていたときすべてがうまくいったので、私は特に混乱しています。お役に立てれば。

于 2012-08-17T19:33:52.720 に答える
0

このQを更新するのを怠ったようです。とにかく、probelmは'console.debug'がwinere内に存在しないため、コードが失敗していました。

Eyal

于 2012-08-19T09:51:17.763 に答える
-1

次のように、bodyloadにphoneGapdeviceReadyイベントをアタッチする必要があります。

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

<body onload="onBodyLoad()"> .. html ... </body>
于 2012-05-09T08:41:06.040 に答える