2013-07-23 144 views
4

我無法獲得設備準備好的功能,在手機內工作,即xcode模擬器。的HTML是如下:` Phonegap不調用設備就緒功能

<title>Boilerplate</title> 
</head> 
<body> 

    <div id="main" data-role="page"> 
     <div data-role="header" class="logo"> 
      <img class="logo" src="img/premium-logo.jpg" /> 
     </div> 

     <div data-role="content"> 

      <h1>Apache Cordova Test Zone</h1> 
      <div class="test-zone" id="test-zone"> 

      </div> 

     </div> 

     <div data-role="footer"> 

      <h4>Footer of main page</h4> 

     </div> 

    </div> 



    <script type="text/javascript" src="js/jquery-2.0.3.min.js"></script> 
    <script type="text/javascript" src="js/jQuery-Mobile-1.3.1-min.js"></script> 
    <script type="text/javascript" src="cordova-2.3.0.js"></script> 
    <script type="text/javascript" src="js/index.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(init()); 
    </script> 
</body> 

JavaScript文件index.js:

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

function onDeviceReady() { 
    alert('It works!'); 
} 

如果我註釋掉初始化函數內部的線路和更換它只需使用onDeviceReady();我可以獲得警報以使用chrome。

爲什麼它不能在模擬器中使用上面的代碼。 謝謝

+1

我會嘗試註冊' document.addEventListener(「deviceready」,onDeviceReady,false);'$(document).ready()'外部''。除此之外'$(document).ready()'將'function'作爲參數,例如。 '$(document).ready(init);' – twil

+0

我試着調用document.addEventListener(「deviceready」,onDeviceReady,false);我已經準備好了在設備上調用init函數。仍然無法看到這是不是在工作 – psycho

+0

那麼,什麼是日誌?我沒有機會使用iOS的PhoneGap,但與Adnroid它並沒有因爲破解JS而被解僱了幾次,我可以在調試日誌中看到它 – twil

回答

6

onDeviceReady事件只從設備模擬器測試您的PhoneGap應用程序時,無法在Chrome工作。

這裏是我發現做兩個框架(phonegap和jQuery Mobile)一起工作的最佳方式。

在我的index.html

<script type="text/javascript" src="js/libs/LABjs/LAB.min.js"></script> 
<script type="text/javascript" src="js/libs/jQuery/jquery-1.9.1.js"></script> 
<script type="text/javascript" src="js/index.js"></script> 
<script type="text/javascript" src="js/libs/jQuery/jquery.mobile-1.3.1.js"></script> 

請注意我用的是LABjs庫加載JS腳本(cordova.js正在被只有當我們發現,我們是在一個設備載入),你可以在Google的LABjs庫中找到它。

在我 「的js/index.js」

var deviceReadyDeferred = $.Deferred(); 
var jqmReadyDeferred = $.Deferred(); 
var resourcesReady = false; 


var app = { 
    // Application Constructor 
    initialize: function() { 
     document.addEventListener('deviceready', this.onDeviceReady, false); 

     //load scripts 
     if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) { 
      $LAB.script("cordova.js").wait(
       function(){ 
        document.addEventListener('deviceready', this.onDeviceReady, false); 
        console.log('We are on Device'); 
       } 
      ); 
     }else 
     { 
      console.log('We are on Browser'); 
      var _this = this; 
      setTimeout(function(){ 
       _this.onDeviceReady(); 
      }, 1); 
     } 

     console.log('app.initialize() Called'); 
     $.when(deviceReadyDeferred, jqmReadyDeferred).then(this.doWhenBothFrameworksReady); 
    }, 

    // deviceready Event Handler 
    onDeviceReady: function() { 
     console.log("onDeviceReady"); 
     deviceReadyDeferred.resolve(); 
    }, 

    doWhenBothFrameworksReady: function() 
    { 
     console.log("doWhenBothFrameworksReady"); 
     resourcesReady = true; 
    } 
}; 

$(document).one("mobileinit", function() { 
    $.support.cors = true; 
    $.mobile.allowCrossDomainPages = true; 
    $.mobile.phonegapNavigationEnabled = true; 
    console.log('MobileInit'); 
    jqmReadyDeferred.resolve(); 
}); 



function PageShowFunction(e) 
{ 
    // we are sure that both frameworks are ready here 
} 

function CallPageEvent(funcToCall,e) 
{ 
    if(resourcesReady) 
    { 
     return funcToCall(e); 
    }else 
    { 
     setTimeout(function() { 
      CallPageEvent(funcToCall,e); 
     }, 200); 
    } 
} 


$(document).ready(function() { 
    console.log("document ready"); 
    // ALL the jQuery Mobile page events on pages must be attached here otherwise it will be too late 
    // example: 
    // I use the CallPageEvent beacause this event could be called before the device ready 
    /* 
    $("#page").on("pageshow", function(e) { 
       CallPageEvent(PageShowFunction,e); 
      } 
    */ 



}); 

app.initialize(); 
+0

是的,我知道我只是說我用chrome來檢查函數是被調用的,但它仍然不能在IOS模擬器上工作。它會加載應用程序,但不會顯示onDeviceReady函數中的警報消息 – psycho

+1

問題在於,當您在文檔的「準備好」事件中設置事件時,onDeviceReady函數已被觸發。 Phoneap和jquery mobil在使用togheter時遇到了這個問題,我將發佈一個使用兩個框架的完整方法。 – ElLocoCocoLoco

+0

感謝您的時間和精力 – psycho

0

只使用

<script type="text/javascript" src="js/index.js"></script> 
<script type="text/javascript"> 
    init(); 
</script> 

INSTEAD OF

<script type="text/javascript" src="js/index.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ init(); }); 
</script>` 
+0

謝謝,但我已經嘗試過,但沒有快樂 – psycho

3

添加

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

您的index.html文件中,工作對我來說)