deviceready 事件永远不会在 phonegap 中触发

deviceready event is never fired in phonegap

我有一个 Sencha Touch 应用程序,它应该只在 phonegap deviceready 事件被 phonegap 触发后才开始加载。

微加载程序由

调用
Ext.blink({
    id:"8b19cfab-9dd1-44d0-892e-28f50a42aecd",
    js:[
        {path:"app.js",update:"full",version:"0.3.5"}
    ],
    css:[
        {path:"resources/css/app.css",update:"full",theme:"Default"},
        {path:"resources/css/sch.css",update:"full"}
    ]
});

在此调用之前,我添加了以下内容:

if(document.URL.indexOf('file://')==0) {
    var oldBlink = Ext.blink;
    Ext.blink = function(options) {
        window.alert('Adding deviceready event listener.');
        document.addEventListener("deviceready", function() {
            window.alert('Deviceready event listener was fired.');
            oldBlink(options);
        }, false);
    }
}

现在,两个 window.alert 调用是同时添加的,仅用于调试目的。只有第一个火。所以没有缓存问题或任何问题,我只需要假设 deviceready 事件根本不会触发,至少在前五分钟内,直到我的 phone 的屏幕关闭。

为什么会这样?

您正在将 Ext.blink 定义为一个函数,因此只有 运行 才会添加事件侦听器。您确定它会 运行 在设备实际准备好之前吗?

我不确定,但也许您需要在 运行 时直接设置事件监听器,而不是延迟到函数调用?

问题已解决。

tl;dr:cordova.js AKA phonegap.js 未添加到项目中。

长版:

对不起,在我发布的代码中找不到问题,尽管我认为我已经涵盖了所有基础。在努力寻找解决方案时,我偶然发现了 http://danmarner.com/2013/05/28/Sencha-Touch-2-and-PhoneGap-integration.html。并发现 cordova.js 必须手动添加。虽然很确定会这样,但我检查了 APK 中是否属于这种情况。事实并非如此。它在预构建 index.html 中,但是:

<script id="microloader" type="text/javascript" src="cordova.js"></script>
<script id="microloader" type="text/javascript" src=".sencha/app/microloader/development.js"></script>

所以,根本原因是:一个简单的复制粘贴错误。 id="microloader" 的第一个脚本调用在 sencha app build 期间被内联微加载器替换。因此,link 到 cordova.js 在构建过程中丢失了。正确的代码应该是

<script type="text/javascript" src="cordova.js"></script>
<script id="microloader" type="text/javascript" src=".sencha/app/microloader/development.js"></script>