-2

長いポーリングを行っています。特定のステートメントが真の場合にボタンを点滅させる機能があります。これは次のとおりです。

function blinking(object, x) {

    console.log(x);

    if(x>0){

        var existing_timer = object.data('clock');
        if (existing_timer){
            clearInterval(existing_timer);
        }

        timer = setInterval(blink, 10);

        function blink() {
            object.fadeOut(400, function() {
               object.fadeIn(400);
            });
        }

    }

}

今..タイマーが「タイマー」として設定されていることに注意してください。誰かがステートメントを偽にする(x = 0にする)ことをしたとき、x = 0を検出したときに、タイマーがボタンの点滅を停止するようにします。これは簡単に聞こえるかもしれませんが、私はすべてを試しました。

私はさまざまなことを研究して試してきましたが、うまくいかないようです。

4

2 に答える 2

1

変数タイマーがグローバルの場合、それを使用して間隔をクリアできるはずです。

clearInterval(timer);

setInterval から返される整数はそのタイマーに固有であるため、これをクリアする必要があります。

于 2013-01-07T21:14:56.533 に答える
0

これが簡単な実装です。

http://jsfiddle.net/AQgBc/

var $led = $('#led'),
    blinkState = 0,
    blinkTimer,
    blinkDuration = 300,
    blink = function () {
      if (blinkState) {
        $led.toggleClass('on');
      }
      console.log('blink');
      blinkTimer = setTimeout(blink, blinkDuration);     
    };

$('button').on('click', function () {
  blinkState = (blinkState) ? 0 : 1;
});

blink();

私はあなたのものを複製せずに自分自身を書きましたが、最も関連する問題は、setInterval を心配してその間隔をクリアするのではなく、setTimeout を使用することだと思います。

コメントに応じて編集:

ユーザーのアクションまで点滅させてからポーリングを停止する場合は、さらに簡単です。

http://jsfiddle.net/AQgBc/1/

var $led = $('#led'),
    blinkState = 1,
    blinkTimer,
    blinkDuration = 300,
    blink = function () {
      if (blinkState) {
        console.log('blink');
        $led.toggleClass('on');

        blinkTimer = setTimeout(blink, blinkDuration);
      }   
    };

$('button').on('click', function () {
  blinkState = (blinkState) ? 0 : 1;
});

blink();
于 2013-01-07T21:22:03.467 に答える