【问题标题】:Phonegap deviceNotReady event?Phonegap deviceNotReady 事件?
【发布时间】:2012-06-04 17:56:52
【问题描述】:

others 一样,我试图区分在移动浏览器和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);
}

【问题讨论】:

    标签: javascript ios cordova


    【解决方案1】:

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

    应该很简单:

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

    【讨论】:

    • 不。加载脚本时会设置这些变量,无论它是否工作。因此,只有在服务器以某种方式知道是否包含 cordova script 标记时才有效,因为用户代理是相同的,所以 AFAICT 是不可能的。
    • 不管客户端如何加载脚本文件对我来说似乎很愚蠢。我假设您正在远程加载所有资产?即你的 phonegap webview 从你的服务器抓取 index.html、phonegap.js 等,就像移动网页视图一样?如果是这样,请考虑不要为您的 phonegap 客户这样做。您的 phonegap 用户已经在等待资产进入,因此您的初始解决方案不会比他们已经体验到的延迟更多。 Phonegap 为您提供了一个“编译”步骤——您在提交到应用商店之前打包您的应用。充分利用这一点。
    • 如果服务器生成的 HTML 页面有办法加载本地资产,请告诉我如何,因为我的理解是这是不可能的。至于将与数据库交互并从我的服务器生成页面的所有逻辑移动到客户端 javascript 中,这实际上并非易事。
    • 您也可以将您的 HTML 打包到应用程序中吗?大概您将应用程序的某些/所有部分托管在您的 Web 可访问服务器上。当您通过 phonegap 编译本机应用程序时,从您的服务器获取 index.html 的快照,并向其添加
    • 没那么简单。与大多数网络一样,HTML 是由服务器动态生成的。无法在应用程序中运行服务器代码,因此将所有 HTML 打包到应用程序中需要从头开始重新编写大部分应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多