Android Cordova 載入html 報錯:deviceready has not fired after 5 seconds.
阿新 • • 發佈:2019-01-28
問題:
通過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);
}
};