2012-06-04 48 views
1

others一樣,我試圖說明在移動瀏覽器中運行的javascript代碼和電話webuiview中的區別。標準解決方案是等待事件觸發,因爲事件觸發後,您知道您處於電話中。但你等多久?Phonegap deviceNotReady事件?

我有代碼,我想盡快運行,因爲我不希望我的用戶坐在等待。但我不想在phonegap初始化之前運行它,如果它要初始化的話。我正在尋找的是類似於devicenotready事件,當cordova.js代碼運行後發生,並確定沒有任何附加條件。或者我可以輪詢一些變量來說明cordova仍在裝載和cordova放棄嘗試裝載之間的區別。有區別嗎?

我討厭這個解決方案,但它是我想到的最好的。請告訴我有什麼東西比這更好:

function whenLoaded(callback,timeout) { 
    var when_loaded_needs_running = true; 
    document.addEventListener('deviceready', function() { 
     if(when_loaded_needs_running) { 
      when_loaded_needs_running = false; 
      callback(); 
     } else { 
      console.log("deviceready fired too late. whenLoaded already ran."); 
     } 
    }); 
    window.setTimeout(function() { 
     if(when_loaded_needs_running) { 
      when_loaded_needs_running = false; 
      console.log("deviceready didn't fire after "+timeout+"ms. running whenLoaded anyway."); 
      callback(); 
     } 
    }, timeout); 
} 

回答

2

一個簡單測試將是看是否cordova JavaScript的全球可用 - 在事件沒有等待,因爲它的理論後,執行就可以立即執行(只要包括cordova.js)。根據您正在運行的PhoneGap版本,您可能需要測試幾個全局變量之一。

應儘可能簡單:

if(cordova || Cordova || PhoneGap) { 
    alert('hey im in a phonegap webview!'); 
} else { 
    alert('regular old browser, aw shucks'); 
} 
+0

都能跟得上。這些變量在加載腳本時會被設置,無論它是否工作。所以這隻有在服務器知道是否包含cordova'script'標記時纔有效,由於用戶代理相同,AFAICT是不可能的。 – Leopd

+0

無論客戶端如何加載腳本文件似乎都很愚蠢。我假設你正在遠程加載所有資產?也就是說,您的手機webview會像移動網頁瀏覽一樣從您的服務器獲取index.html,phonegap.js等內容?如果是這樣,請考慮不要爲您的phonegap客戶端做這件事。您的phonegap用戶已經在等待資產進入,所以您的初始解決方案不會比他們已經經歷的時間延遲得多。 Phonegap爲您提供了一個「編譯」步驟 - 您在提交到應用商店之前打包了您的應用。利用這一點。 –

+0

如果服務器生成的HTML頁面有加載本地資源的方式,請告訴我如何,因爲我的理解是不可能的。至於移動所有與數據庫交互的邏輯,並從我的服務器生成頁面到客戶端JavaScript,這實際上並不重要。 – Leopd