您的页面是否有任何滚动或允许任何类型的系统 UI 动画,如捏缩放等?如果是这样,您的问题可能与 PhoneGap 甚至 FastButton 实现无关,但您是 iOS6 中引入的一个讨厌的错误的受害者。即使您禁用 FastButton 并仅使用 ontouchend 侦听器,即使您使用没有 PhoneGap 的独立网页,您也可以轻松重现此问题。
该错误的工作原理如下:如果在这些系统 UI 动画进行时创建了任何间隔或超时,则这些间隔和超时将不起作用,更糟糕的是,即使在动画完成后重新创建它们也不会使它们起作用. 特别是 JQ 动画在这里经常是一个问题。如果您在页面滚动时调用任何 JQ 动画(使用 FastButton 使用的 onucstart / ontouchend 事件很容易做到这一点,您的动画将失败,动画结束时的任何回调也会失败。
所以解决方案:
我最终选择了第二种解决方案,但我不得不在一个地方修复代码,因为初始化时出现了一些问题。在它说的那一行:
if(uid.indexOf && uid.indexOf(TIMERID) > -1){
我不得不将其更改为:
if(uid && uid.indexOf && uid.indexOf(TIMERID) > -1){
此外,原始代码会进行严格的 iOS6 检查,然后才应用其包装函数。这对于您可以即时更新内容的网站来说很好,但对于一个应用程序,我认为您想要更加偏执,并假设这在 iOS7 及更高版本中可能保持未修复(毕竟,它有时确实看起来就像 Apple 试图尽可能地破坏 Web 应用程序),所以你需要一个 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
}