jQuery: posso chiamare delay () tra addClass () e simili?


178

Qualcosa di semplice come:

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

non sembra funzionare. Quale sarebbe l'alternativa più semplice?


10
volevo fare esattamente la stessa cosa. Sarebbe bello chiamare$("#div").addClassTemporarily("error",1000)
Sebastien Lorber il

Risposte:


365

È possibile creare un nuovo elemento della coda per rimuovere la classe:

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

O usando il metodo dequeue :

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

Il motivo che devi chiamare nexto dequeueè far sapere a jQuery che hai finito con questo oggetto in coda e che dovrebbe passare a quello successivo.


3
Mi piace questa opzione perché semplifica il passaggio di un riferimento all'oggetto jquery utilizzato nella funzione in coda, quindi può essere utilizzato in un contesto più generico (senza nomi con codice fisso).
GrandmasterB,

5
Perché abbiamo bisogno del "prossimo"? Possiamo fare $ ("# div"). AddClass ("errore"). Delay (1000) .queue (function () {$ (this) .removeClass ("error");}); Sembra più elegante?
Vennsoh,

@Vennsoh Non è necessario passare un elemento di coda "successivo". Puoi invece scegliere di usare il metodo dequeue
gfullam,

49

AFAIK il metodo delay funziona solo per le modifiche numeriche CSS.

Per altri scopi JavaScript viene fornito con un metodo setTimeout:

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

11
+1: Non usare Jquery per amor di Jquery. Esistono semplici soluzioni javascript a molti problemi.
Joel

1
+1: è lo stesso del primo commento. Anche Simple JS funziona bene alcune volte.
wowpatrick,

1
+1 per semplicità, ma anche + 1 ha dato la risposta accettata - poiché mi ha fatto notare che .queue () in realtà passa un oggetto di continuazione che deve essere chiamato manualmente (il 'next ()'). Ho trascorso mezz'ora a chiedermi perché la mia catena di callback senza parametri esegua solo la prima - molti esempi su altri siti usano un singolo ritardo nella catena e un callback senza parametri, il che è un po 'fuorviante semplificazione eccessiva di quel meccanismo
quetzalcoatl

1
Solo una nota di pedante: setTimeout proviene dall'oggetto finestra del browser (BOM). JavaScript (inteso come ECMA Script) non ha questo metodo.
corbacho,

9

So che questo è un post molto vecchio, ma ho combinato alcune delle risposte in una funzione wrapper jQuery che supporta il concatenamento. Spero che vada a beneficio di qualcuno:

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

Ed ecco un wrapper removeClass:

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

Ora puoi fare cose come queste: attendere 1 secondo, aggiungere .error, attendere 3 secondi, rimuovere .error:

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


Molto utile! Grazie!
Fabian Jäger,

6

La manipolazione CSS di jQuery non è in coda, ma puoi farla eseguire all'interno della coda 'fx' facendo:

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

Piuttosto la stessa cosa di chiamare setTimeout ma usa invece il meccanismo di coda di jQuery.


Questo funziona per me meglio della risposta accettata (le chiamate non si ripetono se c'è una trasformazione di transizione in classe).
vatavale

4

Ovviamente sarebbe più semplice se estendi jQuery in questo modo:

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

dopodiché puoi usare questa funzione come addClass:

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

1
e se vuoi aggiungere il supporto per il concatenamento, leggi le basi sulla creazione del plugin, o semplicemente aggiungi return thisalla funzione ...
user6322596,

2

Il ritardo funziona su una coda. e per quanto ne so la manipolazione CSS (oltre che tramite animate) non è in coda.


2

delaynon funziona con nessuna funzione in coda, quindi dovremmo usare setTimeout().

E non è necessario separare le cose. Tutto quello che devi fare è includere tutto in un setTimeOutmetodo:

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

Non è necessario utilizzare delay () con setTimeout ().
MattYao,

@MattYao Non penso che tu abbia avuto l'idea. Se non usi setTimeout, quel ritardo non funzionerà
Alex Jolig

1
La soluzione non ha bisogno di entrambi per lavorare insieme. Utilizzare delay () con queue () in jQuery o semplicemente usare setTimeout () per risolvere il problema. Non sto dicendo che la tua risposta sia sbagliata.
MattYao,

0

Prova questo:

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

0

Prova questa semplice funzione freccia:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.