2010-03-24 3 views

Antwort

319

Sie können ein neues Warteschlangenelement erstellen Sie die Klasse entfernen zu tun:

$("#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 soll jQuery wissen lassen, dass Sie mit diesem in der Warteschlange befindlichen Element fertig sind und dass es mit dem nächsten fortfahren sollte.

+2

Ich mag diese Option, weil es einfach ist, einen Verweis auf das jquery-Objekt zu übergeben, das in der Warteschlangenfunktion verwendet wird, sodass es in einem allgemeineren Kontext (ohne fest codierte Namen) verwendet werden kann. – GrandmasterB

+5

Warum brauchen wir "next"? Können wir $ ("# div"). AddClass ("Fehler"). Delay (1000) .queue (function() { $ (this) .removeClass ("error"); }); Scheint eleganter? – Vennsoh

+0

@Vennsoh Sie müssen keinen "nächsten" Warteschlangenposten übergeben. Sie können stattdessen die dequeue() -Methode verwenden: http://api.jquery.com/dequeue/ – gfullam

2

Verzögerung wird in einer Warteschlange ausgeführt. und soweit ich weiß, ist css manipulation (anders als durch animate) nicht in der reihe.

44

AFAIK Die Delay-Methode funktioniert nur für numerische CSS-Modifikationen.

Für andere Zwecke kommt JavaScript mit einer setTimeout Methode:

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

+1: Benutze Jquery nicht für Jquery. Es gibt einfache JavaScript-Lösungen für viele Probleme. – Joel

+1

+1: Genau wie der erste Kommentar. Simple JS funktioniert auch manchmal einwandfrei. – wowpatrick

+1

+1 für die Einfachheit, sondern auch + 1'ed die angenommene Antwort - wie es mich darauf hinwies, dass die .queue() tatsächlich Folgeobjekt übergibt, die manuell aufgerufen werden muss (die 'next()').Ich habe die Hälfte der Stunde damit verbracht, mich zu fragen, warum meine Kette von parameterlosen Callbacks nur die erste ausführt - viele Beispiele auf anderen Sites verwenden eine einzige Verzögerung in der Kette und einen parameterlosen Callback, was eine etwas irreführende Vereinfachung dieses Mechanismus ist – quetzalcoatl

0

Versuchen Sie folgendes:

function removeClassDelayed(jqObj, c, to) {  
    setTimeout(function() { jqObj.removeClass(c); }, to); 
} 
removeClassDelayed($("#div"), "error", 1000); 
5

jQuery CSS-Manipulation nicht die Warteschlange gestellt wird, aber man kann es in der 'fx' Warteschlange ausgeführt machen, indem Sie:

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

ganz das gleiche wie der Aufruf von setTimeout verwendet aber stattdessen jQuerys Warteschlangenmechanismus.

1

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); 
}; 

nach, dass Sie diese Funktion wie addClass verwenden können:

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

https://learn.jquery.com/plugins/basic-plugin-creation/ – user6322596

+1

und wenn Sie hinzufügen möchten Verketten Sie die Unterstützung, lesen Sie die Grundlagen über die Plugin-Erstellung, oder fügen Sie einfach "return this" zur Funktion hinzu ... – user6322596

4

Ich weiß, das dies ein sehr alt ist Post, aber ich habe ein paar der Antworten in eine jQuery-Wrapper-Funktion kombiniert, die Verkettung unterstützt. Hoffe, es profitiert jemand:

$.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 Sachen wie diese tun - 1sec warten, fügen .error, 3secs warten, entfernen .error:

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

+0

Sehr hilfreich! Vielen Dank! –