【问题标题】:How to extend delay for slide toggle without repeating effect?如何在不重复效果的情况下延长滑动切换的延迟?
【发布时间】:2013-12-13 23:51:56
【问题描述】:

我想让它在单击按钮时显示隐藏的 div 几秒钟并再次隐藏。这段代码完成了:

HTML:

<button class="clicky">click me</button>

<div class="flashy" style="display: none; width: 150px; font-size: 18px; margin-top: 25px;">
    Now you see me!
</div>

JS:

jQuery(".clicky").on("click", function() {
    flashDiv();
});

function flashDiv()
{
    $(".flashy").slideToggle(100).effect("highlight", 300).delay(4000).slideToggle(100);
}

JSFIDDLE:http://jsfiddle.net/NRz34/1/

不过,有一点我很不喜欢:如果你快速连续多次点击按钮,效果会一遍遍重复(即它会向下滑动,显示几秒钟,向上滑动,然后重复单击按钮的次数)。

我的问题是,如何修改它,而不是一遍又一遍地上下滑动(无论它被点击了多少次),它在最后一次点击后只停留 4 秒?

示例:

多次点击时的当前行为:

  1. 点击点击点击
  2. 向下滑动
  3. 显示 4 秒
  4. 向上滑动
  5. 再重复两次

多次点击时的期望行为:

  1. 点击点击点击
  2. 向下滑动
  3. 显示 4 秒
  4. 向上滑动

注意:

我意识到我可以检查 DIV 是否可见,如果是则忽略按钮按下,但这并不是我想要的行为。你看,我希望 DIV 在最后一次按下按钮后保持可见 4 秒,所以如果按下按钮,然后在 2 秒后再次按下,按钮应该再保持可见 4 秒(总显示时间为 6 秒)。

【问题讨论】:

    标签: javascript jquery html jquery-ui slidetoggle


    【解决方案1】:

    只需在通话开头添加.stop(true)。这将停止任何当前动画并清除动画队列,然后重新开始。另外,请使用slideDown/slideUp,这样您就不会处于未确定状态。如果你在它已经显示的时候点击,slideDown() 不会做任何事情,然后从那个时间到slideUp() 会增加 4000ms。

    function flashDiv()
    {
        $(".flashy").stop(true).slideDown(100).effect("highlight", 300).delay(4000).slideUp(100);
    }
    

    JSFiddle Demo

    编辑:我了解到.delay().stop() 不能很好地结合在一起,正如文献中提到的那样 (http://api.jquery.com/delay/)。

    要解决这个问题,您可以使用带有无用动画的.animate(),例如将width 动画化为当前的width 值。还有,停止动画会导致highlight效果卡住,所以我在调用开始时清除了background-color

    function flashDiv()
    {
        $(".flashy").css('background-color', 'transparent').stop(true).slideDown(100).effect('highlight', 300).animate({'width':150}, 4000).slideUp(100);
    }
    

    JSFiddle Demo

    【讨论】:

    • 非常漂亮,但似乎有点小故障。尝试以 1 或 2 秒的间隔单击它,单击几下后它会向上滑动。
    • 已解决,见编辑。可能有更好的方法,但这似乎有效。 (编辑:哎呀...忘记添加停止...现在可以使用)
    • 非常好!非常感谢!!
    【解决方案2】:

    您需要使用setTimeout() 才能取消delay,因为无法取消jQuery 的延迟。

    var timer;
    jQuery(".clicky").on("click", function() {
        flashDiv();
    });
    
    function flashDiv()
    {
        if($(".flashy").is(":visible")){
            window.clearTimeout(timer);
            $(".flashy").stop(true);
            timer = window.setTimeout(function() {
                $(".flashy").slideUp(100);
            }, 4000);
        }
        else{
            $(".flashy").slideDown(100).effect("highlight", 300);
            timer = window.setTimeout(function() {
                $(".flashy").slideUp(100);
            }, 4000);
        } 
    
    }
    

    (http://jsfiddle.net/g2wV4/3)

    这样,您在 4 秒后启动计时器以执行 slideUp,但如果再次单击并且 闪烁 可见,您将停止前一个计时器并启动一个新计时器。

    【讨论】:

      【解决方案3】:

      修改后的解决方案,允许在每次额外的 clcik 后保持打开状态

      jQuery(".clicky").on("click", flashDiv);
      
      function flashDiv() {
      
          var $flash = $(".flashy"), timer=$flash.data('timer');
          if (timer) {
              clearTimeout(timer);
              setSlideUp($flash);
          } else {
              $flash.slideDown(100).effect("highlight", 300, function () {
                  setSlideUp($flash);
              })
          } 
      }
      
      function setSlideUp($flash) {
          var delay = 2000; /* shorter for demo purposes*/
          var timer = setTimeout(function () {
              $flash.slideUp();
             $flash.data('timer', false)
          }, delay)
          $flash.data('timer', timer)
      }
      

      DEMO

      【讨论】:

      • 所以这样可以防止多次出现效果,但是如果再次点击按钮不会延长DIV的显示时间,对吧?
      • 防止是...不确定您所说的延长时间是什么意思。这也不会发生
      • 好的...只是重新阅读关于保持开放时间更长的信息。需要针对该行为完全重新配置它
      • 修改了我的解决方案,包括延长打开时间
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2021-12-21
      • 2017-09-06
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多