jQuery:我可以在addClass()和此类之间调用delay()吗?


178

像这样简单:

$("#div").addClass("error").delay(1000).removeClass("error");

似乎不起作用。什么是最简单的选择?


10
想做完全一样的事情。打电话给我们很酷$("#div").addClassTemporarily("error",1000)
Sebastien Lorber

Answers:


365

您可以创建一个新的队列项来删除该类:

$("#div").addClass("error").delay(1000).queue(function(next){
    $(this).removeClass("error");
    next();
});

或使用出方法:

$("#div").addClass("error").delay(1000).queue(function(){
    $(this).removeClass("error").dequeue();
});

您需要调用next或的原因dequeue是让jQuery知道您已完成此排队项目,并且该项目应继续进行下一个项目。


3
我喜欢这个选项,因为它使传递给队列函数中使用的jquery对象的引用变得容易,因此可以在更通用的上下文中使用(无需硬编码名称)。
GrandmasterB '11 /

5
为什么我们需要“下一个”?我们可以做$(“#div”)。addClass(“ error”)。delay(1000).queue(function(){$(this).removeClass(“ error”);}); 看起来更优雅?
Vennsoh 2013年

@Vennsoh您不需要传递“下一个”队列项。您可以选择使用dequeue()方法代替:api.jquery.com/dequeue
gfullam 2014年

49

AFAIK延迟方法仅适用于数字CSS修改。

出于其他目的,JavaScript附带了setTimeout方法:

window.setTimeout(function(){$("#div").removeClass("error");}, 1000);

11
+1:不要为了Jquery而使用Jquery。有许多简单的javascript解决方案。
乔尔

1
+1:与第一个评论相同。简单JS有时也可以正常工作。
wowpatrick 2011年

1
为了简单起见,+ 1,但也接受了已接受的答案+1-正如我指出的那样,.queue()实际上传递了必须手动调用的延续对象(“ next()”)。我花了半个小时,想知道为什么我的无参数回调链仅执行第一个-其他站点上的许多示例都使用链中的单个延迟和无参数回调,这有点误导了该机制的过度简化
quetzalcoatl

1
请注意:setTimeout来自浏览器的窗口对象(BOM)。JavaScript(理解为ECMA脚本)没有该方法。
corbacho 2012年

9

我知道这是一篇非常老的文章,但是我将一些答案组合到了支持链接的jQuery包装器函数中。希望它能使某人受益:

$.fn.queueAddClass = function(className) {
    this.queue('fx', function(next) {
        $(this).addClass(className);
        next();
    });
    return this;
};

这是一个removeClass包装器:

$.fn.queueRemoveClass = function(className) {
    this.queue('fx', function(next) {
        $(this).removeClass(className);
        next();
    });
    return this;
};

现在您可以执行以下操作-等待1秒,添加.error,等待3秒,删除.error

$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');


很有帮助!谢谢!
FabianJäger18年

6

jQuery的CSS操作没有排队,但是您可以通过执行以下操作使其在“ fx”队列中执行:

$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });

与调用setTimeout完全一样,但是使用jQuery的队列机制。


对于我来说,这比接受的答案更好(如果班上有过渡转换,则不会重复通话)。
vatavale

4

当然,如果像这样扩展jQuery,它将更加简单:

$.fn.addClassDelay = function(className,delay) {
    var $addClassDelayElement = $(this), $addClassName = className;
    $addClassDelayElement.addClass($addClassName);
    setTimeout(function(){
        $addClassDelayElement.removeClass($addClassName);
    },delay);
};

之后,您可以使用此函数,例如addClass:

$('div').addClassDelay('clicked',1000);

1
如果您想添加链接支持,请阅读有关插件创建的基础知识,或者直接添加return this到函数中……
user6322596,2016年

2

延迟对队列进行操作。据我所知,CSS操作(不是通过动画)不是排队。


2

delay在无队列功能上不起作用,因此我们应该使用setTimeout()

而且您不需要分离事物。您需要做的就是将所有内容都包含在一个setTimeOut方法中:

setTimeout(function () {
    $("#div").addClass("error").delay(1000).removeClass("error");
}, 1000);

您不必将delay()与setTimeout()一起使用。
MattYao

@MattYao我不认为您有这个主意。如果您不使用setTimeout,那么延迟将无法工作
Alex Jolig

1
该解决方案不需要两者一起工作。在jQuery中将delay()与queue()一起使用,或者仅使用setTimeout()即可解决此问题。我并不是说您的答案是错误的。
MattYao


0

试试这个简单的箭头功能:

setTimeout( () => { $("#div").addClass("error") }, 900 );

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.