Antworten:
Sie können ein neues Warteschlangenelement erstellen, um die Klasse zu entfernen:
$("#div").addClass("error").delay(1000).queue(function(next){
$(this).removeClass("error");
next();
});
Oder mit der Dequeue- Methode:
$("#div").addClass("error").delay(1000).queue(function(){
$(this).removeClass("error").dequeue();
});
Der Grund, warum Sie anrufen müssen next
oder dequeue
möchten, besteht darin, jQuery mitzuteilen, dass Sie mit diesem Element in der Warteschlange fertig sind und dass es mit dem nächsten fortfahren soll.
AFAIK Die Verzögerungsmethode funktioniert nur für numerische CSS-Änderungen.
Für andere Zwecke wird JavaScript mit einer setTimeout-Methode geliefert:
window.setTimeout(function(){$("#div").removeClass("error");}, 1000);
Ich weiß, dass dies ein sehr alter Beitrag ist, aber ich habe einige der Antworten in einer jQuery-Wrapper-Funktion zusammengefasst, die die Verkettung unterstützt. Hoffe, es kommt jemandem zugute:
$.fn.queueAddClass = function(className) {
this.queue('fx', function(next) {
$(this).addClass(className);
next();
});
return this;
};
Und hier ist ein removeClass-Wrapper:
$.fn.queueRemoveClass = function(className) {
this.queue('fx', function(next) {
$(this).removeClass(className);
next();
});
return this;
};
Jetzt können Sie solche Dinge tun - 1 Sekunde warten, hinzufügen .error
, 3 Sekunden warten, entfernen .error
:
$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
Die CSS-Manipulation von jQuery wird nicht in die Warteschlange gestellt. Sie können sie jedoch in der Warteschlange 'fx' ausführen, indem Sie Folgendes tun:
$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });
Ganz genauso wie beim Aufrufen von setTimeout, verwendet jedoch stattdessen den Warteschlangenmechanismus von jQuery.
Natürlich wäre es einfacher, wenn Sie jQuery wie folgt erweitern:
$.fn.addClassDelay = function(className,delay) {
var $addClassDelayElement = $(this), $addClassName = className;
$addClassDelayElement.addClass($addClassName);
setTimeout(function(){
$addClassDelayElement.removeClass($addClassName);
},delay);
};
Danach können Sie diese Funktion wie addClass verwenden:
$('div').addClassDelay('clicked',1000);
return this
die Funktion hinzu ...
Die Verzögerung wird in einer Warteschlange ausgeführt. und soweit ich weiß, ist die CSS-Manipulation (außer durch Animieren) nicht in der Warteschlange.
delay
funktioniert nicht mit Funktionen ohne Warteschlange, daher sollten wir verwenden setTimeout()
.
Und Sie müssen keine Dinge trennen. Alles, was Sie tun müssen, ist, alles in eine setTimeOut
Methode aufzunehmen:
setTimeout(function () {
$("#div").addClass("error").delay(1000).removeClass("error");
}, 1000);
Versuche dies:
function removeClassDelayed(jqObj, c, to) {
setTimeout(function() { jqObj.removeClass(c); }, to);
}
removeClassDelayed($("#div"), "error", 1000);
Probieren Sie diese einfache Pfeilfunktion aus:
setTimeout( () => { $("#div").addClass("error") }, 900 );
$("#div").addClassTemporarily("error",1000)