jQuery: addClass () ile bu tür arasında delay () öğesini çağırabilir miyim?


178

Şu kadar basit bir şey:

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

çalışmıyor gibi görünüyor. En kolay alternatif ne olurdu?


10
aynı şeyi yapmak istedim. Aramak güzel olurdu$("#div").addClassTemporarily("error",1000)
Sebastien Lorber

Yanıtlar:


365

Sınıfı kaldırmanız için yeni bir kuyruk öğesi oluşturabilirsiniz:

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

Veya dequeue yöntemini kullanarak :

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

Aramanız nextya dequeueda jQuery'ye bu kuyruğa sokulmuş öğeyle işin bittiğini ve bir sonrakine geçmesi gerektiğini bildirmektir.


3
Kuyruk fonksiyonunda kullanılan jquery nesnesine bir referans geçmesini kolaylaştırdığı için bu seçeneği beğendim, böylece daha genel bir bağlamda (sabit kodlu adlar olmadan) kullanılabilir.
GrandmasterB

5
Neden "ileri" ye ihtiyacımız var? $ ("# Div") yapabilir miyiz. AddClass ("error"). Delay (1000) .queue (function () {$ (this) .removeClass ("error");}); Daha zarif görünüyor mu?
Vennsoh

@Vennsoh 'Sıradaki' bir kuyruk öğesi iletmeniz gerekmez. Bunun yerine dequeue
gfullam

49

AFAIK gecikme yöntemi yalnızca sayısal CSS değişiklikleri için çalışır.

Diğer amaçlar için JavaScript bir setTimeout yöntemiyle gelir:

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

11
+1: Jquery uğruna Jquery kullanmayın. Birçok probleme basit javascript çözümleri vardır.
Joel

1
+1: İlk yorumla aynı. Basit JS de bazı zamanlarda iyi çalışır.
wowpatrick

1
Basitlik için +1, aynı zamanda kabul edilen cevabı + 1'ledi. Yarım saatini neden parametresiz geri arama zincirimin sadece ilkini yürüttüğünü merak ettim - diğer sitelerdeki birçok örnek zincirde tek bir gecikme ve bu mekanizmanın biraz yanıltıcı aşırı basitleştirilmesi olan parametresiz geri arama kullanıyor
quetzalcoatl

1
Sadece bilgili bir not: setTimeout, tarayıcının pencere nesnesinden (BOM) gelir. JavaScript (ECMA Script olarak anılır) bu yönteme sahip değildir.
corbacho

9

Bu çok eski bir yazı olduğunu biliyorum ama birkaç cevap zincirleme destekleyen bir jQuery sarma işlevine birleştirdim. Umarım birine fayda sağlar:

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

Ve burada bir removeClass sarıcısı var:

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

Şimdi böyle şeyler yapabilirsiniz - 1 saniye bekleyin, ekleyin .error, 3 saniye bekleyin, kaldırın .error:

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


Çok yararlı! Teşekkür ederim!
Fabian Jäger

6

jQuery'nin CSS manipülasyonu sıraya alınmaz, ancak bunu yaparak 'fx' kuyruğunda yürütülmesini sağlayabilirsiniz:

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

SetTimeout'u çağırmakla aynı şey ama bunun yerine jQuery'nin kuyruk mekanizmasını kullanıyor.


Bu benim için kabul edilen yanıttan daha iyi çalışır (sınıfta bir geçiş dönüşümü varsa çağrılar tekrarlanmaz).
vatavale

4

Elbette jQuery'yi bu şekilde genişletirseniz daha basit olurdu:

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

bundan sonra bu işlevi addClass gibi kullanabilirsiniz:

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

1
ve zincirleme desteği eklemek, eklenti oluşturma hakkında temel bilgileri okumak veya sadece return thisişleve eklemek
istiyorsanız

2

Gecikme bir kuyrukta çalışır. ve bildiğim kadarıyla css manipülasyon (animate dışında) sıraya alınmaz.


2

delayhiçbiri kuyruk işlevi üzerinde çalışmaz, bu nedenle kullanmalıyız setTimeout().

Ve bir şeyleri ayırmanıza gerek yok. Tek yapmanız gereken her şeyi bir setTimeOutyönteme dahil etmek:

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

SetTimeout () ile delay () kullanmanıza gerek yoktur.
MattYao

@MattYao Fikri aldığını sanmıyorum.
SetTimeout'u

1
Çözümün her ikisinin birlikte çalışması gerekmez. Ya jQuery'de queue () ile delay () kullanın ya da setTimeout () kullanın sorunu çözebilir. Cevabınızın yanlış olduğunu söylemiyorum.
MattYao

0

Bunu dene:

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

0

Bu basit ok işlevini deneyin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.