使用谷歌的快速按钮后,Phonegap应用程序崩溃

时间:2012-09-26 16:44:44

标签: java javascript jquery cordova

我有一个phonegap应用程序,可以在不同页面的图库中显示图像。 我正在使用Google的快捷按钮https://developers.google.com/mobile/articles/fast_buttons来缩短页面之间切换时的300毫秒延迟。 我正在使用https://github.com/alexblack/google-fastbutton中的js文件 我在做的是:

按钮:

<a data-role="button" data-theme="b" href="#" id="nextimage">Next</a>

javascript的init方法中的事件处理程序:

$('#nextimage').fastClick(function(e) {
    showGalleryPage(nextPageIndex);  });

这适用于3-4次点击,但在某些时候,当我点击按钮时,应用程序类型的崩溃和控制会返回到第一页。 它在Logcat中没有通知我调试。 我想知道解决这个问题的方法。 有人可以帮我调试吗? 感谢。

1 个答案:

答案 0 :(得分:2)

您的页面是否有任何滚动或允许任何类型的系统UI动画,如缩放缩放等?如果是这样,你的问题可能与PhoneGap甚至FastButton实现无关,但你是iOS6中引入的一个讨厌的bug的受害者。即使您禁用了FastButton并且只使用ontouchend监听器,即使您使用没有PhoneGap的独立网页,您也可以轻松地重现此问题。

错误的作用如下:如果在这些系统UI动画正在进行时创建任何间隔或超时,那些间隔和超时将无法工作,更糟糕的是,甚至在动画完成后重新创建它们赢得& #39;让他们工作。特别是JQ动画在这里经常是一个问题。如果在页面滚动时调用任何JQ动画(这很容易使用FastButton正在使用的ontoucstart / ontouchend事件,那么您的动画将失败,动画结束时的任何回调也将失败。

所以解决方案:

  • 如果可能,请使用CSS动画。这当然只有动画才是首先导致问题的原因。如果它的其他类型的setInterval / setTimeout破坏了,CSS动画不会帮助你。

  • 对于使用iOS6中引入的webkit的requestAnimationFrames的计时器,使用自定义包装器。请查看并从此处下载:https://gist.github.com/4180482

我最终选择了第二个解决方案,但是我必须在一个地方修复代码,因为我的初始化有些问题。在它所说的行:

if(uid.indexOf && uid.indexOf(TIMERID) > -1){

我不得不将其更改为:

if(uid && uid.indexOf && uid.indexOf(TIMERID) > -1){

此外,原始代码进行严格的iOS6检查并仅应用其包装函数。这对于你可以动态更新内容的网站来说很好,但是对于一个应用程序,我认为你想要更加偏执,并认为这可能在iOS7中保持不变(毕竟,它有时看起来确实如此)就像Apple试图在任何地方破坏网络应用程序一样)所以你想要一个ios6 +检查。找到说:

的行
if (!navigator.userAgent.match(/OS 6(_\d)+/i)) return;

并将其替换为:

if(/(iPhone|iPod|iPad)/i.test(navigator.userAgent)) {
    if(/OS [2-5]_\d(_\d)? like Mac OS X/i.test(navigator.userAgent)) {
        // iOS 2-5, map to native Timers
        return
    } else if(/CPU like Mac OS X/i.test(navigator.userAgent)) {
        // iOS 1, map to native Timers
        return
    }
}
else
{
    // Not iOS, map to native Timers
    return
}