基于 1.6.1 的 phonegap 构建应用程序中未触发 deviceready 事件
Posted
技术标签:
【中文标题】基于 1.6.1 的 phonegap 构建应用程序中未触发 deviceready 事件【英文标题】:deviceready event not fireing in phonegap build app based on 1.6.1 【发布时间】:2012-04-28 13:04:32 【问题描述】:背景:
我正在运行我正在使用 phonegap build (1.6.1) 构建的 phonegap 应用程序。
android build 似乎工作得很好,
但是在 ios 上(Iphone 3GS 16M iOS: 5.0.1 (9A405) )我从来没有收到deviceready
事件。
我想弄清楚我在这里缺少什么。
问题:
1. deviceready
事件的绑定是在包含 phonegap.js
之前还是之后?
2. 会不会是事件“过早”发生而我的处理程序还没有绑定到它?
3. 是否有基于轮询的方法来确定设备是否准备就绪?
4. 与JQuery的$(document').ready
相关的deviceready应该在哪里处理?
我的代码:
我当前的代码尝试同步 3 件事:
1. JQuery的.ready
事件
2.PhoneGap的deviceready
事件
3.(小心)window.navigator.device.platform上的轮询结果
通过以下方式:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script>
<script type="text/javascript" src="./scripts/jquery.myapp.js"></script>
<script type="text/javascript">
window.myapp=
deviceReady:false,
JQueryReady:false,
started:false,
logbuf:[]
function log(m)
window.myapp.logbuf.push(m);
console.debug(window.myapp.logbuf.join('||'));
var el=document.getElementById('container');
if (el!=null)
el.innerHTML+=', ' + window.myapp.logbuf.join('||') ;
window.myapp.logbuf=[];
//Wait for device
function onDeviceReady()
window.myapp.deviceReady=true;
log('phonegap deviceready event fired');
startIfAllReady();
document.addEventListener("deviceready", onDeviceReady, false);
function pollDevice()
if (window && window.navigator && window.navigator.device && window.navigator.device.platform )
log('polling found device');
window.myapp.deviceReady=true;
startIfAllReady();
else
log('polling');
window.setTimeout(arguments.callee,500);
pollDevice();
//Wait for jquery
$(document).ready(
function()
window.myapp.JQueryReady=true;
log('jquery document.ready event fired');
startIfAllReady();
);
function startIfAllReady()
log('startIfAllReady window.myapp.JQueryReady=' + window.myapp.JQueryReady + ' window.myapp.deviceReady=' + window.myapp.deviceReady + ' window.myapp.started=' + window.myapp.started );
if (window.myapp.deviceReady && window.myapp.JQueryReady && window.myapp.started==false)
log('starting');
started=true;
renderClient();
else
log('cant start');
function renderClient()
log('renderClient called - RETURNING !');
return;
window.setTimeout(function()window.scrollTo(0, 1),100);
log('create myappClient');
$('#myappClientContainer').empty().myappClient(
width:$(window).width(),
height:$(window).height()
);
</script>
<script type="text/javascript" src="phonegap.js"></script>
<link rel="stylesheet" type="text/css" href="./styles/client.css" />
<style>
html , body margin:0px; background-color:gray;
</style>
<title>myapp</title>
</script>
</head>
<body style="width:100%">
<script>
log('body script executing');
</script>
<div style="width:100%" id="myappClientContainer">DEFAULT HTML</div>
</body>
</html>
代码结果: 在常规浏览器(chrome)中,我得到:
默认 HTML 轮询||执行正文脚本||触发 jquery document.ready 事件 startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false 无法启动 轮询 轮询 轮询 ...(和轮询....)在 iPhone 上:
默认 HTML 轮询||执行正文脚本||触发 jquery document.ready 事件 startIfAllReady window.myapp.JQueryReady=true window.myapp.deviceReady=false window.myapp.started=false 无法启动如您所见 - 任何地方都没有“触发 phonegap deviceready 事件”,轮询似乎也不起作用:(
请注意,在 iphone 上,开始时只有一个“轮询”日志条目... iPhone 不能处理 onTimeout 吗? 为什么我没有得到 deviceready 事件?!
我注意到的另一件事: 当(phonegap)使用调试集构建时, 我可以在 PhoneGapBuild weinre 调试窗口中看到设备/应用一段时间,然后它就消失了。
谢谢
更新: 我上面的轮询循环是错误的, 它应该寻找 window.navigator.platform
不管怎样,我把它们都放在一起了。 有些东西是行不通的。
【问题讨论】:
【参考方案1】:令人惊讶的是,我的问题通过添加解决了 ..script src="phonegap.js... 到我的html文件
来源: http://community.phonegap.com/nitobi/topics/javascript_events_not_working_with_android_phonegap_build_xcode
我的印象是构建过程添加了 ipmort,我特别困惑,因为当我绕过 deviceready 事件时一切都很好。希望这会有所帮助。
【讨论】:
构建会添加 JS 本身,但不会添加加载它的脚本行。【参考方案2】:好像我忽略了更新这个 Q。 无论如何,问题是 winere 中不存在“console.debug”,所以我的代码失败了。
艾尔
【讨论】:
【参考方案3】:您必须在身体负载上附加 phoneGap deviceReady 事件,如下所示:
<script>
function onBodyLoad()
document.addEventListener("deviceready", onDeviceReady, false);
</script>
<body onload="onBodyLoad()"> .. html ... </body>
【讨论】:
是的,它不适用于我的代码。目前正在由phonegap/nitobi/adobe的好心人调试。 对于任何偶然发现这个答案的人来说,这显然不是真的。以上是关于基于 1.6.1 的 phonegap 构建应用程序中未触发 deviceready 事件的主要内容,如果未能解决你的问题,请参考以下文章
是否可以分析 Android 或 iOS 上的 PhoneGap 应用缓存?
基于 Swift 项目的 PhoneGap/Cordova App
在 Xcode 4 下构建 PhoneGap 时出现未定义符号错误?