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

ser*_*erg 175 jquery delay

简单的事情:

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

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

Pet*_*dIt 355

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

$("#div").addClass("error").delay(1000).queue(function(next){
    $(this).removeClass("error");
    next();
});
Run Code Online (Sandbox Code Playgroud)

或者使用出方法:

$("#div").addClass("error").delay(1000).queue(function(){
    $(this).removeClass("error").dequeue();
});
Run Code Online (Sandbox Code Playgroud)

你需要调用next或者dequeue让jQuery知道你完成了这个排队的项目并且它应该转移到下一个项目的原因.

  • 为什么我们需要"下一步"?.我们可以做$( "#DIV")addClass( "错误")延迟(1000).queue(函数(){$(本).removeClass( "错误");}); 看起来更优雅? (5认同)
  • 我喜欢这个选项,因为它可以很容易地传递对排队函数中使用的jquery对象的引用,因此它可以在更通用的上下文中使用(没有硬编码名称). (3认同)

Jas*_*per 48

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

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

window.setTimeout(function(){$("#div").removeClass("error");}, 1000);
Run Code Online (Sandbox Code Playgroud)

  • +1:不要为Jquery使用Jquery.有许多问题的简单JavaScript解决方案. (11认同)
  • 只是一个学究注:setTimeout 来自浏览器的窗口对象(BOM)。JavaScript(理解为 ECMA 脚本)没有这种方法。 (2认同)

小智 8

我知道这是一篇非常古老的帖子,但我将一些答案合并到一个支持链接的jQuery包装函数中.希望它有益于某人:

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

这是一个removeClass包装器:

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

现在你可以做这样的事情 - 等待1秒,添加.error,等待3秒,删除.error:

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


war*_*ign 6

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

$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });
Run Code Online (Sandbox Code Playgroud)

与调用setTimeout完全相同,但使用jQuery的队列机制.


小智 6

当然如果你像这样扩展 jQuery 会更简单:

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

之后你可以像 addClass 一样使用这个函数:

$('div').addClassDelay('clicked',1000);
Run Code Online (Sandbox Code Playgroud)