0

関数のwindow.setinterval後に 2 つの if 条件を記述しました。Firefox、Opera、IE で思い通りに動作します。Webkit エンジンでは、関数は引き継がれません。

 x = window.setInterval(function() {
            if(a.speed >= a.maxSpeed && b.speed >= b.maxSpeed && c.speed >= c.maxSpeed) {
                 a.stop();
                 b.stop();
                 c.stop();
            }
            if(a.speed === 0 && b.speed === 0 && c.speed === 0 && completed === 3) {
                window.clearInterval(x);
                enableControl();
                printResult();
                enableControl(); 
            }
        }, 100);

最大速度に達したときに停止機能を呼び出し、速度が 0 の場合に結果を表示する間隔を設定しました。Mozilla、IE、Opera では、私が望んでいたとおりに動作します。しかし、webkit では、最初の if 条件自体が実行されていません。無限ループが実行されています。

最初のif条件が実行されていない場合でも、ネストされたifも試しました。この問題の解決を手伝ってください。

これが正しいアプローチでない場合、タイムアウトをトリガーしc.stop()、手動で a、b、c の速度を 0 にしてから、コントロールを有効にして結果を表示できますか?

これはあなたが求めた停止機能です:

 Slot.prototype.stop =        function() {
    var _this = this,
        limit = 30;
    clearInterval(_this.si);
    _this.si = window.setInterval(function() {
        if(_this.speed > limit) {
            _this.speed -= _this.step;
            $(_this.el).spSpeed(_this.speed);
        }
        if(_this.speed <= limit) {
            _this.finalPos(_this.el);
            $(_this.el).spSpeed(0);
            $(_this.el).spStop();
            clearInterval(_this.si);
            $(_this.el).removeClass('motion');
            _this.speed = 0;
        }
    }, 100);
};
4

1 に答える 1

0

あなたがあなたの質問を回避するような答えを許すなら、setIntervalとにかくあなたが本当に使うべきではないという議論があります(これこれを見てください)。時間間隔に関する保証の強さはOSとブラウザに依存するため、それほど強くはありません。setTimeout必要に応じて使用して自分自身を再スケジュールする関数をスケジュールするために使用することをお勧めしますsetTimeout。間隔の正確さが気になる場合は、必要に応じていつでも時間間隔をリアルタイムに調整できます。

于 2013-02-01T07:12:23.597 に答える