1

ギャラリーの画像を別のページに表示する 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 に通知がありません。この問題を解決する方法を知りたいです。誰かがこれをデバッグするのを手伝ってくれますか? ありがとう。

4

1 に答える 1

2

ページにスクロールがありますか、またはピンチからズームなど、あらゆる種類のシステム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
}
于 2012-12-09T03:48:38.543 に答える