ページにスクロールがありますか、またはピンチからズームなど、あらゆる種類のシステムUIアニメーションが可能ですか?もしそうなら、あなたの問題はおそらくPhoneGapやFastButtonの実装とは何の関係もありませんが、あなたはiOS6で導入された厄介なバグの犠牲者です。FastButtonを無効にしてontouchendリスナーを使用する場合や、PhoneGapのないスタンドアロンのWebページを使用する場合でも、この問題を簡単に再現できます。
バグは次のように機能します。これらのシステムUIアニメーションの進行中に間隔またはタイムアウトが作成された場合、それらの間隔とタイムアウトは機能しません。さらに悪いことに、アニメーションの実行後にそれらを再作成しても機能しません。 。特にJQアニメーションはここでしばしば問題になります。ページのスクロール中にJQアニメーションを呼び出すと(FastButtonが使用しているontoucstart / ontouchendイベントで簡単に実行できます)、アニメーションは失敗し、アニメーションの最後にあるコールバックも失敗します。
したがって、解決策:
可能であればCSSアニメーションを使用してください。もちろん、これはアニメーションがそもそも問題の原因である場合にのみ発生します。壊れているのが他の種類のsetInterval/setTimeoutである場合、CSSアニメーションは役に立ちません。
iOS6で導入されたwebkitのrequestAnimationFramesを使用するタイマー用のカスタムメイドのラッパーを使用します。こちらからご覧になり、ダウンロードしてください:https ://gist.github.com/4180482
最終的に2番目の解決策を採用しましたが、初期化で問題が発生したため、コードを1か所で修正する必要がありました。それが言う行で:
if(uid.indexOf && uid.indexOf(TIMERID) > -1){
私はそれを次のように変更する必要がありました:
if(uid && uid.indexOf && uid.indexOf(TIMERID) > -1){
また、元のコードはiOS6を厳密にチェックし、そのラッパー関数を適用します。これは、その場で更新できるWebサイトには問題ありませんが、アプリの場合は、もう少し偏執的になり、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
}