私は主に自己完結型で、必要な場合にのみサーバーと通信するモバイルWebアプリを開発中です。現在、使用されているライブラリは、次のとおりです。iOS 5 Safari JavaScriptの実行がタイムアウトを超過しました
- のjQuery 1.6.4
- のjQuery UI 1.8.3
- 私たちがしたのiOS 5のリリースまではjQTouch
の修正/パッチを当てたバージョンtouchscroll.jsも使用していますが、Safariは固定とネイティブのスクロールをサポートしています。
のiOS 5のリリース以来、一見ランダムに、この例外が発生します
JavaScript: Error undefined JavaScript execution exceeded timeout
それが提起されると、時間以上の非常に短い期間に実行なしJSコード(たとえば1ms)がSafariによって実行されます。ページを更新したり、新しいページに行ったり、新しいドメインに行ったりすることは効果がありません。でも、任意およびすべてのJSコード、
for(var i = 0; i < 30; i++) ;
のような単純なものでは提起されている例外なく、ブラウザで実行されることはありません。これを回避するには、強制的にSafariを強制終了して再起動するしかありません。私は、window.setTimeout(...、1)のアプリケーションに遠隔からの「ヘビーデューティ」コードをラップしたり、UI更新以外のすべてに対してWeb Workersを利用することもできますが、アプリケーションとしての優れたソリューションはかなり大きく、大幅な書き換えが必要になります。
誰もこの問題が発生しましたか? Safariをこの壊れた状態に置くように見えるコードは一切ではなく、一見無作為に起こる可能性があるので、このようなものをデバッグするにはどうしたらいいですか?
私はJSエンジンのタイムアウトは次の手順を実行して、モバイルSafariであるかを把握しようとした:
var start, end;
start = new Date();
try {
while(true);
} catch (ex) {
alert('test');
}
end = new Date();
console.log(Number(end) - Number(start) + 'ms');
残念ながら、でキャッチすることができないので、このタイムアウト例外はJS例外ではないようですtry/catchブロック。ただし、最大タイムアウト期間は数秒の範囲内にあるように見えます。私たちのアプリのコードのどれもブラウザ/ JSエンジンを(それは恐ろしいUXを提供するだろう)ロックしていないと思いますが、おそらくそれはおそらくサブミットの実行時間が300ミリ秒です。
私は同じ問題を有し、かつ間隔またはWatchPositionを使用していない - intead私はjQueryの流砂のプラグインを使用しています...何をすべきかかなり確実ではありません。 – Ash
ブラウザが壊れた状態になっていますか、実行がタイムアウトしてもスクリプトはまだ実行されていますか?これらのプラグインがCSSアニメーションをサポートしていない限り、QuicksandやjQuery UIなどのプラグインはモバイル開発には使用しません。ソフトウェアのアニメーションはかなり重い資源であり、モバイルブラウザで簡単にタイムアウトする可能性があります。あなたがそれを使用することを主張するなら、私はCSSアニメーション、トランスフォーム、およびトランジションを絶対配置とループの代わりに書き直すことを検討します。 CSSのアプローチはSafariでハードウェアアクセラレーションを使用しており、パフォーマンスは向上しています。 – illvm