5

このJavaScript関数があるとしましょう:

   function pauseComp(ms) {
     var date = new Date();
     var curDate = null;
     do { curDate = new Date(); }
     while(curDate-date < ms);
    }

および css3 アニメーション (たとえば、<i class="icon-spinner icon-spin"></i>新しいfont-awesome 3から)。上記の JavaScript 関数を実行すると、関数の実行中にスピナーが停止します。私がここで話していることを見てください。基本的に、javascript は css アニメーションを停止します。その理由、または他の誰かがこれに気付いた/回避策を見つけたのではないかと思っています。fnが長いプロセスであるsetTimeout(fn、0)に入れてみましたが、それが機能しない理由に気づきました(jsはマルチスレッドではありません)。これが起こっているのを見た人はいますか?

更新: 興味深いことに、これは Safari ではそれほど問題ではないように見えますが、ブラウザ インターフェイスとのやり取りにはまだ影響があります。

4

1 に答える 1

5

ブラウザページはシングルスレッドです。UIの更新は、JavaScriptプログラムと同じスレッドで行われます。これは、Javascriptコードの実行中は、どのアニメーションも新しいフレームを描画しないことも意味します。通常、これは大したことではありません。ほとんどのJSコードは、単一のアニメーションフレームよりも非常に高速に実行されるためです。

したがって、最善のアドバイスは単純にこれです。そうしないでください。JSエンジンをそんなに長くロックしないでください。それを行うためのよりクリーンな方法を見つけてください。


ただし、必要な場合は、方法があります。HTML5のWebWorkersAPIを介して追加のスレッドを取得できます。これは古いブラウザではサポートされていませんが、メインのWebページから独自のスレッドで長時間実行されているCPU吸引コードを実行し、完了したら結果をページにポストバックすることができます。

于 2013-01-16T20:34:22.520 に答える