Respostas:
Você pode criar um novo item de fila para remover a classe:
$("#div").addClass("error").delay(1000).queue(function(next){
$(this).removeClass("error");
next();
});
Ou usando o método de deueue :
$("#div").addClass("error").delay(1000).queue(function(){
$(this).removeClass("error").dequeue();
});
O motivo pelo qual você precisa ligar next
ou dequeue
é informar ao jQuery que você terminou com esse item na fila e que ele deve passar para o próximo.
AFAIK, o método de atraso, funciona apenas para modificações numéricas de CSS.
Para outros fins, o JavaScript vem com um método setTimeout:
window.setTimeout(function(){$("#div").removeClass("error");}, 1000);
Eu sei que este é um post muito antigo, mas eu combinei algumas das respostas em uma função de wrapper jQuery que suporta encadeamento. Espero que beneficie alguém:
$.fn.queueAddClass = function(className) {
this.queue('fx', function(next) {
$(this).addClass(className);
next();
});
return this;
};
E aqui está um wrapper removeClass:
$.fn.queueRemoveClass = function(className) {
this.queue('fx', function(next) {
$(this).removeClass(className);
next();
});
return this;
};
Agora você pode fazer coisas como esta - aguarde 1 segundo, adicione .error
, aguarde 3 segundos, remova .error
:
$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
A manipulação de CSS do jQuery não está na fila, mas você pode executá-la dentro da fila 'fx' fazendo:
$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });
Exatamente o mesmo que chamar setTimeout, mas usa o mecanismo de fila do jQuery.
Obviamente, seria mais simples se você estender o jQuery assim:
$.fn.addClassDelay = function(className,delay) {
var $addClassDelayElement = $(this), $addClassName = className;
$addClassDelayElement.addClass($addClassName);
setTimeout(function(){
$addClassDelayElement.removeClass($addClassName);
},delay);
};
Depois disso, você pode usar esta função como addClass:
$('div').addClassDelay('clicked',1000);
return this
à função ...
O atraso opera em uma fila. e, tanto quanto eu sei, a manipulação de CSS (que não seja através do Animate) não está na fila.
delay
não funciona em nenhuma função da fila, portanto devemos usá-lo setTimeout()
.
E você não precisa separar as coisas. Tudo que você precisa fazer é incluir tudo em um setTimeOut
método:
setTimeout(function () {
$("#div").addClass("error").delay(1000).removeClass("error");
}, 1000);
Tente o seguinte:
function removeClassDelayed(jqObj, c, to) {
setTimeout(function() { jqObj.removeClass(c); }, to);
}
removeClassDelayed($("#div"), "error", 1000);
Experimente esta simples função de seta:
setTimeout( () => { $("#div").addClass("error") }, 900 );
$("#div").addClassTemporarily("error",1000)