【问题标题】:Timer won't die javascript计时器不会死 javascript
【发布时间】:2013-01-07 21:11:16
【问题描述】:

我正在做一些长时间的轮询。当某个陈述为真时,我有一个让按钮闪烁的功能。这里是:

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 时停止让按钮闪烁。这听起来很简单,但我已经尝试了所有方法哈。

我一直在研究和尝试不同的东西,但它似乎不起作用。

【问题讨论】:

  • 如果x 等于0,您的if 语句将返回false 并跳过整个逻辑块。
  • timer 怎么会停下来?您在existing_timer 上调用clearInterval,而不是timer。此外,blink 是您的重复函数,但明确发生在 blinking 中,它只会被调用一次。
  • 您只查询一次x 值,而不是在每个闪烁间隔。
  • 我现在注意到了..让我看看我是否可以纠正自己
  • 排队两个动画 - 每个持续 400 毫秒 - 每 10 毫秒是一个非常非常糟糕的主意。

标签: javascript jquery setinterval long-polling


【解决方案1】:

如果您的变量计时器是全局的,那么您应该能够使用它来清除间隔:

clearInterval(timer);

从 setInterval 返回的整数对于该计时器是唯一的,因此您需要清除它。

【讨论】:

  • 我试过了.. @justin 不起作用。长轮询部分不断调用该函数
  • 可能发生了其他事情......你应该创建一个 jsfiddle,我们可以从那里开始
  • 您始终可以隔离您的组件。并且仅隔离 javascript 和计时器将帮助您调试自己的问题。
【解决方案2】:

这是一个简单的实现。

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();

我只是写了自己的,没有复制你的,但我认为最相关的问题只是使用 setTimeout 而不是担心 setInterval 并清除该间隔。

编辑以回应评论:

如果您希望它在用户操作之前一直闪烁,然后停止轮询,那就更简单了。

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();

【讨论】:

  • 谢谢!但是请参阅我需要让它保持循环,直到用户单击其他地方告诉数据库他们看到它的地方。然后按钮将停止闪烁。
  • 你能合并我的原始脚本吗
  • 你哪里出了问题?我宁愿帮你理解也不愿为你写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多