繁体   English   中英

javascript setTimeout 函数在 1 次调用后行为不正常

[英]javascript setTimeout function does not behave normally after 1 call

我有以下功能:

function loadInfoBubble(aString)
        {
            $('#infoBubble').html('<h3>info :</h3><p>'+aString+'</p>');
            infoBubble.style.display = "block";

            var opacity = 9;
            var vanishBlock = null;

            var theTimeOut = setTimeout(function()
            {
                vanishBlock = setInterval(function()
                {
                    if(opacity > 0)
                    {
                        opacity--;
                    }
                    infoBubble.style.opacity = "0."+opacity;
                }, 100);
            }, 7000); 

            var theTimeOut2 = setTimeout(function()
            {
                infoBubble.style.display = "none";
                clearInterval(vanishBlock);
            }, 9000);

        }

此函数通过 onclick 事件链接到按钮。 该函数应该显示一个包含一个句子的块 9 秒,7 秒后它开始消失。

它在第一次调用时表现正常,但是如果我单击几次,它就不再起作用,即使我让 timeOuts 结束。

我不明白为什么因为每个超时或间隔都属于它自己的变量。

您的代码永远不会将不透明度重置回 1。此外,如果您在一个循环完成之前再次触发该操作,则不会取消前一个循环。 因此,如果您触发气泡,然后在 5 秒后再次触发它,第一个循环仍将运行,并且气泡将在 2 秒内消失。 如果再次单击 ,气泡将被第二次单击时开始的循环淡化。

我认为您需要做的是使用气泡对象本身保存计时器引用,然后在您想要开始显示周期时重置所有内容。 您可以使用 jQuery .data()方法:

function loadInfoBubble(aString) {
  var $bubble = $("#infoBubble");
  $bubble
    .html('<h3>info :</h3><p>' + aString + '</p>')
    .css({ display: "block", opacity: 1 });

  var opacity = 9;

  var timers = $bubble.data("timers") || {};
  clearInterval(timers.vanishBlock);
  clearTimeout(timers.showTimer);
  clearTimeout(timers.clearTimer);

  timers = {
    showTimer: setTimeout(function() {
      timers.vanishBlock = setInterval(function() {
        if (opacity > 0) {
          opacity--;
        }
        $bubble.css({ opacity: "0." + opacity });
      }, 100);
    }, 7000),
    clearTimer: setTimeout(function() {
      $bubble.css({ display:  "none" });
      clearInterval(timers.vanishBlock);
    }, 9000)
  };
  $bubble.data("timers", timers);
}

提琴手

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM