14

最新のiOS(iOS 6)でこの奇妙な動作に気づきました。内部にsetTimeoutがあるタッチイベントの関数を呼び出す場合、setTimeout内の部分はトリガーされません。

これは、スクロールやズームイン/ズームアウトなどの「システムアニメーション」がある場合にのみ発生します。

例えば:

http://jsfiddle.net/p4SdL/2/

(私はテストのためだけにjqueryを使用しましたが、純粋なjsでも同じことが起こります)

iOS 6デバイスでサファリでそのページを開き、ズームインまたはズームアウトします。アラートが呼び出されることはありません。

iOS 5デバイスでテストした場合、これは問題なく機能します。これらのアニメーション中に、setTimeoutまたはsetIntervalがOSによってリセットされるようです。これは意図された動作ですか、それともバグですか?

ありがとう

4

1 に答える 1

19

:UIWebViewはrequestAnimationFramesをサポートしていないようです。それを指摘してくれたGuillaumeGendreに感謝します!

作業中のWebアプリで同様の問題が発生しました。

私たちにとって、問題を引き起こしたのはtouchmoveでした。回避策(ここにあります:https ://gist.github.com/3755461 )を実装しましたが、別の問題によってそれを放棄せざるを得なくなるまで、かなりうまく機能しているように見えました。(私はあなたのフィドルに回避策を追加しようとしましたが、タイマーを1〜2回起動させることができましたが、一貫して再現することはほぼ不可能である奇妙なジェスチャー+スクロールイベントが必要でした。)

とにかく、開発者向けのiOS 6の新機能の1つは、requestAnimationFramesです。私の回避策は基本的にタイマーのラッパーであり、開発者がブール値を渡すことができます。ブール値は、ネイティブ関数または回避策関数のいずれかを呼び出します。

例えば:

setTimeout(function(){alert("HI")}, 1000); // using native
setTimeout(function(){alert("HI")}, 1000, true); // using workaround

回避策を使用する追加の方法は次のとおりです。

setInterval(function(){console.log("Interval")}, 1000, true);

var timer = setTimeout(function(){ /* ... */ }, 60000, true);
clearTimeout(timer);

var interval = setInterval(someFunc, 10000, true);
if(someCondition) clearInterval(interval);

回避策の例を示す2つのフィドルを次に示します。黒い四角をピンチ/ズームしてみてください。

http://jsfiddle.net/xKh5m/embedded/result(ネイティブsetTimeout関数を使用) http://jsfiddle.net/ujxE3/embedded/result

この回避策は実稼働環境で数か月使用しており、大きな問題は発生していません。

回避策の概要は次のとおりです:https ://gist.github.com/4180482

requestAnimationFramesの詳細は次のとおりです。

MDNドキュメント

requestAnimationFrameのポールアイリッシュ

幸運を!

于 2012-10-17T00:03:16.523 に答える