jQuery .delay()不起作用

时间:2013-07-08 08:48:30

标签: jquery

我有以下JavaScript代码段:

$("#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类更改。更改后,它应再次显示#dashboard。所以我在添加和删除delay() - 类之间设置standby。为了查看它是否有效,我添加了3sek的持续时间过长。

但它并没有延迟!为什么不呢?我没有看到......

8 个答案:

答案 0 :(得分:11)

delay仅适用于通过动画管道的动作,并且不会对像这样的即时原子操作的时间产生影响。为了延迟添加或删除类等内容,您可以使用setTimeout

  

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

     

.delay()方法最适合延迟排队的jQuery效果。因为它是有限的 - 例如,它没有提供取消延迟的方法 - .delay()不能替代JavaScript的本机setTimeout函数,这可能更适合某些用例。

答案 1 :(得分:3)

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

setTimeout(function() {
... do stuff ... 
}, 3000);

这将在3秒(3000毫秒)

中执行... do stuff ...中的代码

答案 2 :(得分:3)

延迟将无法按照您期望的方式在这些行上运行:

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

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

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

如果要将其扩展为多个图像,请尝试使用更强大的“.animate”功能淡入淡出。 “Animate”可以被赋予一个回调函数,在完成时将被调用。

答案 3 :(得分: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">
&#13;
&#13;
&#13;

答案 4 :(得分:2)

尝试使用.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")
    });

答案 5 :(得分:1)

所有延迟都从$(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毫秒的延迟,然后是fadeOut(),持续时间为3000毫秒。 fadeOut与延迟同步,但下一行代码与此代码完全异步。

然后它进入下一行。等等。它不会等到你的延迟完成,它只是开始依靠背景。

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

我留下这个以防万一有人因我而感到困惑

答案 6 :(得分:0)

似乎你想要做什么,你可能想看看CSS过渡:

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

您仍然可以拥有.addClass(),但现在您的班级将使用这些过渡属性,您将不需要.delay()。

答案 7 :(得分:0)

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

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