【问题标题】:jQuery .delay() doesn't workjQuery .delay() 不起作用
【发布时间】:2013-07-08 08:48:30
【问题描述】:

我有以下 JavaScript sn-p:

$("#dashboard").addClass("standby").delay(3000).removeClass("standby");
$(".active").removeClass("active");
$("." + target).addClass("active");
$(".showDiv").removeClass("showDiv").addClass("hide");
$("#" + target).removeClass("hide").addClass("showDiv");

虽然#dashboard 处于待机,它应该处理所有这些CSS-Class 更改。更改后,它应该再次显示#dashboard。所以我在standby-class 的添加和删除之间设置了delay()。为了查看它是否有效,我添加了 3sek 的持续时间太长。

但它不会延迟!为什么不呢?没看到。。。

【问题讨论】:

  • 延迟用于排队的物品作为动画元素,这里没有什么可以延迟的
  • 这里对 javascript 如何执行存在误解,但这并不是导致问题的真正原因。作为进一步的研究,以帮助您更好地理解 javascript 代码的工作原理,我推荐这个视频,它解释了 javascript 事件循环,它是 javascript 如何运行的一个组成部分。 youtube.com/watch?v=8aGhZQkoFbQ
  • 我已经有了,要么被接受,要么被拒绝,只有时间会证明一切。
  • 点击“重新打开”;问题中描述的预期结果可以使用.delay(duration, queueName) 实现

标签: jquery


【解决方案1】:

delay 只会作用于通过动画管道的动作,不会影响像这样的即时原子操作的时间。为了延迟诸如添加或删除类之类的事情,您可以使用setTimeout

.delay() 方法允许我们延迟执行队列中跟随它的函数。它可以与标准效果队列或自定义队列一起使用。

.delay() 方法最适合在排队的 jQuery 效果之间进行延迟。因为它是有限的——例如,它不提供取消延迟的方法——.delay() 不能替代 JavaScript 的原生 setTimeout 函数,这可能更适合某些用例。

【讨论】:

  • “延迟只对通过动画管道的动作起作用” .delay() 可以在动画管道之外使用 .queue() , .dequeue()
【解决方案2】:

.delay() 只会延迟 jQuery 中的动画。 要设置实际延迟,您可能需要使用setTimeout()

let cancelId;
// ...
cancelId = window.setTimeout(function() {
  // ... do stuff ... 
}, 3000);

// If you want to cancel prematurely, use `window.clearTimeout`
if (cancelId) {
  window.clearTimeout(cancelId);
}

这将在 3 秒(3000 毫秒)内执行 ... do stuff ... 中的代码

【讨论】:

    【解决方案3】:

    如前所述...延迟不会像您期望的那样工作... 以下是它的工作原理:

    $(document).ready(function(){        
        var audio = new Audio('sang3.mp3');
        audio.play();
    
        $("#image1")
            .hide()
            .attr("src", "https://placeholdit.imgix.net/~text?txtsize=63&bg=FF6347&txtclr=ffffff&txt=Image-1&w=350&h=250")
            .fadeIn(1000)
            .delay(3000)
            .fadeOut(1000)
            .queue(function(next) { 
              $(this).attr("src", "https://placeholdit.imgix.net/~text?txtsize=63&bg=FF6347&txtclr=ffffff&txt=Image-2&w=350&h=250")
              next(); 
            })
            .fadeIn(1000); 
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <img src="" id="image1">

    【讨论】:

      【解决方案4】:

      延迟不会像你期望的那样在这些线上工作:

      $("#image1").delay(9000).attr("src", "image/image1.jpg");
      $("#image1").delay(9000).attr("src", "image/image2.jpg");
      

      它将立即运行属性更改。为什么?因为属性更改不是“动画”的一部分。延迟只能与动画函数一起使用。

      如果您只需要两张图片,最简单的方法是将两张图片堆叠在一起,然后根据需要淡入淡出。

      如果您想将其扩展到许多图像,请尝试使用更强大的“.animate”函数来淡入和淡出。 “Animate”可以被赋予一个回调函数,当完成时将被调用。

      【讨论】:

      • “延迟只能与动画功能一起使用。” fwiw .delay() 也可以与 .queue().dequeue() 一起使用,而无需为元素设置动画
      • 是的,guest271314,我想它可以,这也有助于解决手头的问题。
      【解决方案5】:

      尝试使用.queue()

        $("#image1").delay(5000).fadeIn(3000, function() {
            $(this).delay(9000, "task" ).queue("task", function() {
              $(this).attr("src", "image/image1.jpg")
              .delay(5000).fadeOut(3000, function() {
                $(this).delay(9000, "task")
                .queue("task", function() {
                  $(this).attr("src", "image/image2.jpg")
                  .delay(5000).fadeIn(3000, function() {
                     $(this).delay(5000).fadeOut(3000)
                  })
                }).dequeue("task")
              });
            }).dequeue("task")
          });
      

      【讨论】:

        【解决方案6】:

        你所有的延迟都始于$(document).ready();

        $("#image1").delay(5000).fadeIn(3000);
        $("#image1").delay(9000).attr("src", "image/image1.jpg"); 
        $("#image1").delay(5000).fadeOut(3000);
        $("#image1").delay(9000).attr("src", "image/image2.jpg");
        $("#image1").delay(5000).fadeIn(3000);
        $("#image1").delay(5000).fadeOut(3000);
        

        这样想。当 doc 准备好时,JS 开始执行该函数中的任何内容,它执行的第一个延迟是:$("#image1").delay(5000).fadeIn(3000);

        这将启动 5000 毫秒的延迟,然后是持续时间为 3000 毫秒的fadeOut()。这个 fadeOut 与延迟是同步的,但下一行代码与这行​​完全异步。

        然后它进行到下一行。等等。它不会等到您的延迟完成,它只是开始在后台计数。

        .delay() 应用于同一元素时会堆叠:JSFiddle

        我留下这个以防有人像我一样感到困惑

        【讨论】:

        • 嗯,现在说得通了,但是这样的任务怎么可能完成呢?我看到人们使用setTimeout 也看到人们使用setInterval,我试图弄清楚这些是如何做到的,但不幸的是没有成功。您能否举一个简短的例子,如何做到这一点?你有什么建议。
        • 不像jQuery栈中的原生JS超时delay(),所以这个解释是不正确的。
        • ".delay" 函数按预期正常工作,当在同一个对象上使用它们时,就像她一样。这不是问题。
        【解决方案7】:

        似乎对于您正在尝试做的事情,您可能想看看 CSS 过渡:

        http://css-tricks.com/almanac/properties/t/transition/

        您仍然可以拥有.addClass(),但现在您的类将使用这些转换属性,并且您不需要 .delay()。

        【讨论】:

          【解决方案8】:

          通常我们需要在移除待机状态之前做一些事情,所以我们在一个ajax回调中移除这个类:

          $("#dashboard").addClass("standby");
          $.get('urltoget',function(data){
            if(data)
              $("#dashboard").removeClass("standby");
            else
              $("#dashboard").removeClass("standby").addClass('error');
          })
          

          【讨论】:

            猜你喜欢
            • 2011-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-20
            • 1970-01-01
            • 2011-03-29
            相关资源
            最近更新 更多