Cordova中deviceready事件未触发

11
我的cordova项目中,deviceready事件在iOS上没有正确触发。我已经搜寻了数小时,但仍然无法解决。我是否做错了什么?js/cordova.js的路径也已存在。

我的cordova项目中,deviceready事件在iOS上没有正确触发。我已经搜寻了数小时,但仍然无法解决。我是否做错了什么?js/cordova.js的路径也已存在。

<html>
<head>
    <title>Geolocation</title>
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, target-densityDpi=device-dpi, user-scalable=no" />
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="css/app.css">
    <script type="text/javascript">

    // Fastclick
    if ('addEventListener' in document) {
        document.addEventListener('DOMContentLoaded', function() {
        FastClick.attach(document.body);
        }, false);
    }

    </script>
    <script type="text/javascript" charset="utf-8" src="js/cordova.js"></script>
    <script type="text/javascript" charset="utf-8">

    // Wait for device API libraries to load
    //
    function onLoad() {
        document.addEventListener("deviceready", onDeviceReady, false);
    }

    // device APIs are available
    //
    function onDeviceReady() {
        alert("ready");
        // Now safe to use device APIs
    }

    </script>
</head>
<body onload="onLoad()">

我不确定自己错过了什么,因为在Chrome检查时没有出现任何错误。


Chrome?你需要执行 APK 吧,我猜.. - Rayon
@RayonDabre 在我的iOS设备上也没有触发。构建和部署需要时间,因此我通常使用python SimpleHTTPServer提供前端文件以进行频繁检查。 - Kody R.
deviceready 只会在原生应用程序中触发,而不会在设备浏览器中触发。 - Rayon
@RayonDabre 我想这可能是情况,但无论如何都不起作用,所以我并不确定。 - Kody R.
将其作为“应用程序”执行,如果不起作用..相应地更新您的问题. - Rayon
4个回答

11

不需要将 cordova.js 放在你的 www/js/ 文件夹内,因为该文件会从其他位置复制到 platforms/ios/platform_www (例如通过运行 cordova build ios),与 index.html 文件在相同的层级,因此为了获得正确的配置,请按照以下语句进行操作:

<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script>

必须更改为:

<script type="text/javascript" charset="utf-8" src="cordova.js"></script>

是的,但不是因为那个原因 - 我在下面添加了我的答案。我不知道为什么以前它没有起作用,但现在可以了! - Kody R.

9

deviceready 事件对于任何应用程序都是至关重要的。它表示 Cordova 设备 API 已加载并准备好访问。

更新

我通过从 body 中删除 onload="onLoad()" 并替换为以下内容使 "deviceready" 正常工作:

function onLoad() {
    document.addEventListener("deviceready", onDeviceReady, false);
}

只需要这样:
document.addEventListener("deviceready", onDeviceReady, false);

@RayonDabre 哦,现在就清楚多了! - Kody R.
1
@RayonDabre 原始帖子是从 Cordova 网站复制并粘贴的,因此我认为从他们自己的网站上复制这么简单的内容应该是可行的,但显然不是这样。 - Kody R.
当应用程序启动时,我们需要等待“deviceready”事件,以便我们可以与PhoneGap API的某些部分进行交互... - Rayon
1
@slackmart https://cordova.apache.org/docs/en/latest/cordova/events/events.deviceready.html@slackmart https://cordova.apache.org/docs/en/latest/cordova/events/events.deviceready.html - Kody R.
这个建议似乎保证了插件在执行DOM JavaScript代码之前被加载。我不再使用onLoad事件了。 - pollaris
显示剩余2条评论

7
我遇到了相同的问题,我的解决方案是添加:
<script type="text/javascript" src="cordova.js"></script>

在HTML文件中,一切都完美地工作了。


4

我也遇到过类似问题,但是在我的情况下 cordova.js 已经正确引入了。

最终对我有用的方法是简单地 移除重新添加 ios 平台:

cordova platform remove ios
cordova platform add ios

相当一段时间以来,我已经完全重建了ios平台,并且在此期间发生了其他重大变化(Cordova升级,XCode升级等)。有可能我的config.xml或现有的ios构建与最新的Cordova要求不兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接