1

其他人一样,我试图区分在移动浏览器和 phonegap webuiview 中运行的 javascript 代码之间的区别。标准解决方案是等待deviceready事件触发,因为在它触发后,您知道您处于 phonegap 中。但是你要等多久?

我有想要尽早运行的代码,因为我不希望我的用户坐在那里等待。但是我不想在 phonegap 初始化之前运行它,如果它要初始化的话。我正在寻找的是一个devicenotready事件,它会在之后的cordova.js代码运行并确定没有任何东西可以附加时触发。或者我可以轮询一些变量来区分科尔多瓦仍在加载和科尔多瓦放弃尝试加载之间的区别。有区别吗?

我讨厌这个解决方案,但这是我想出的最好的解决方案。请告诉我有比这更好的东西:

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);
}
4

1 回答 1

2

一个更简单的测试是查看cordovaJavaScript 全局是否可用 - 无需等待事件,您可以立即执行(只要它在理论上<script>包含 cordova.js 之后执行)。根据您运行的 PhoneGap 版本,您可能需要测试几个全局变量之一。

应该很简单:

if(cordova || Cordova || PhoneGap) {
  alert('hey im in a phonegap webview!');
} else {
  alert('regular old browser, aw shucks');
}
于 2012-06-05T01:31:21.523 回答