菜鸟教程小白 发表于 2022-12-12 03:56:42

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


                                            <p><p>背景:</p>

<p>我正在运行我正在使用 phonegap build (1.6.1) 构建的 phonegap 应用程序。</p>

<p>android build 似乎工作得很好,
但是在 iOS (Iphone 3GS 16M iOS: 5.0.1 (9A405) ) 我从来没有得到 <code>deviceready</code> 事件。</p>

<p>我想弄清楚我在这里缺少什么。</p>

<p>问题:
1. <code>deviceready</code> 事件的绑定(bind)是在包含 <code>phonegap.js</code> 之前还是之后?
2. 会不会是事件“过早”发生而我的处理程序还没有绑定(bind)到它?
3. 是否有基于轮询的方法来确定设备是否准备就绪?
4. 与JQuery的<code>$(document').ready</code>相关的deviceready应该在哪里处理?</p>

<p>我的代码:
我当前的代码尝试同步 3 件事:
1. JQuery的<code>.ready</code>事件
2.PhoneGap的<code>deviceready</code>事件
3.(小心)window.navigator.device.platform上的轮询结果</p>

<p>通过以下方式:</p>

<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;

    &lt;script type=&#34;text/javascript&#34; src=&#34;./scripts/jquery-1.7.2.js&#34;&gt;&lt;/script&gt;
    &lt;script type=&#34;text/javascript&#34; src=&#34;./scripts/jquery.myapp.js&#34;&gt;&lt;/script&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      window.myapp={
            deviceReady:false,
            JQueryReady:false,
            started:false,
            logbuf:[]
      }

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

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

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

      pollDevice();

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


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

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

    &lt;/script&gt;

    &lt;script type=&#34;text/javascript&#34; src=&#34;phonegap.js&#34;&gt;&lt;/script&gt;

    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;./styles/client.css&#34; /&gt;
    &lt;style&gt;
      html , body { margin:0px; background-color:gray;}
    &lt;/style&gt;

    &lt;title&gt;myapp&lt;/title&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body style=&#34;width:100%&#34;&gt;

&lt;script&gt;
    log(&#39;body script executing&#39;);
&lt;/script&gt;
&lt;div style=&#34;width:100%&#34; id=&#34;myappClientContainer&#34;&gt;DEFAULT HTML&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>代码结果:
在常规浏览器(chrome)中,我得到:</p>

<pre>默认 HTML
轮询||执行正文脚本||触发 jquery document.ready 事件
startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false
无法启动
轮询
轮询
轮询
...(和轮询....)
</pre>

<p>在 iPhone 上:</p>

<pre>默认 HTML
轮询||执行正文脚本||触发 jquery document.ready 事件
startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false
无法启动
</pre>

<p>如您所见 - 任何地方都没有“触发 phonegap deviceready 事件”,轮询似乎也不起作用:(</p>

<p>请注意,在 iphone 上,开始时只有一个“轮询”日志条目...
iPhone 不能处理 onTimeout 吗?
为什么我没有得到 deviceready 事件?!</p>

<p>我注意到的另一件事:
当(phonegap)使用调试集构建时,
我可以在 PhoneGapBuild weinre 调试窗口中看到设备/应用一段时间,然后它就消失了。</p>

<p>谢谢</p>

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

<p>不管怎样,我把它们都放在一起了。
有些东西是行不通的。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>令人惊讶的是,我的问题通过添加解决了
    ..script src="phonegap.js...
到我的html文件</p>

<p>来源:
<a href="http://community.phonegap.com/nitobi/topics/javascript_events_not_working_with_android_phonegap_build_xcode" rel="noreferrer noopener nofollow">http://community.phonegap.com/nitobi/topics/javascript_events_not_working_with_android_phonegap_build_xcode</a> </p>

<p>我的印象是构建过程添加了 ipmort,我特别困惑,因为当我绕过 deviceready 事件时一切都很好。希望这会有所帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 基于 1.6.1 的 phonegap 构建应用程序中未触发 deviceready 事件,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10363735/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10363735/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 基于 1.6.1 的 phonegap 构建应用程序中未触发 deviceready 事件