1. 程式人生 > >Android Cordova 載入html 報錯:deviceready has not fired after 5 seconds.

Android Cordova 載入html 報錯:deviceready has not fired after 5 seconds.

問題:
通過Cordova 載入html 頁面,在低版本手機上處理正常,但在高版本手機上出現異常(大概是Android 8.0 以上)
查明的原因大概是:

'deviceready has not fired after 5 seconds.'

也即 html 檔案中的 onDeviceReady 方法沒有觸發

onDeviceReady: function() {}

程式碼片段如下:

<script type="text/javascript">
/**
 * Created by Administrator on 2015/7/29.
 */

"use strict";
var
IScroll; // new FastClick(document.body); (function($) { })(Zepto); var app = { initialize: function() { this.bindEvents(); }, bindEvents: function() { document.addEventListener('deviceready', this.onDeviceReady, false); }, //----- 劃重點 --------> 問題在於 onDeviceReady 沒有觸發
onDeviceReady: function() { app.receivedEvent('deviceready'); }, receivedEvent: function(id) { $("#wrapper .field-group").addClass('hide'); $("#wrapper .divide-con").addClass('hide'); //通過呼叫navigationHtmlPage物件的recvShareParam方法,傳入id,獲取當前審批訊息的id; //getParamsCallback是非同步成功返回執行方法。
NavigationHtmlPage.recvShareParam(getParamsCallback, function(failed) {}, ['id']); //獲取流程相關的資料 getWorkflowData(function() { //初始化表單控制元件 $(".form-con").initForm(); //開啟表單動態驗證功能 $(".form-con").DynamicvalidateForm(); }); //獲取需要預設傳入表單的資料 getDataCollector(getDataCollectorCallback); } }; /** * 執行app */ app.initialize(); ...
</script>

解決方案:
經過除錯發現,對問題頁面重新載入能正確觸發 onDeviceReady() 方法

程式碼優化如下:

<script type="text/javascript">
/**
 * Created by Administrator on 2015/7/29.
 */

"use strict";
var IScroll;
// new FastClick(document.body);
(function($) {

})(Zepto);

var ISReload = false;//重載入標識
var app = {

    initialize: function() {
        this.bindEvents();
    },

    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
        //延時100毫秒後進行重載入
        setTimeout(function() {
                    if (!ISReload) {
                        window.location.reload();//重載入
                    }
        },100)
    },
    onDeviceReady: function() {
        ISReload = true;//更新重載入標識
        app.receivedEvent('deviceready');
    },

    receivedEvent: function(id) {

        $("#wrapper .field-group").addClass('hide');
        $("#wrapper .divide-con").addClass('hide');


        //通過呼叫navigationHtmlPage物件的recvShareParam方法,傳入id,獲取當前審批訊息的id;
        //getParamsCallback是非同步成功返回執行方法。
        NavigationHtmlPage.recvShareParam(getParamsCallback, function(failed) {}, ['id']);


        //獲取流程相關的資料
        getWorkflowData(function() {
            //初始化表單控制元件
            $(".form-con").initForm();

            //開啟表單動態驗證功能
            $(".form-con").DynamicvalidateForm();
        });



        //獲取需要預設傳入表單的資料
        getDataCollector(getDataCollectorCallback);

    }

};