2010-03-24 13 views
150

Qualcosa di semplice come:jQuery: Posso chiamare delay() tra addClass() e così via?

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

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

+6

voleva fare esattamente la stessa cosa. Sarebbe bello chiamare '$ (" # div "). AddClassTemporarily (" error ", 1000)' –

risposta

319

È possibile creare un nuovo elemento della coda per fare la tua rimozione della classe:

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

sia utilizzando il metodo dequeue:

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

Il motivo per cui è necessario chiamare next o dequeue consente a jQuery di sapere che hai finito con questo elemento in coda e che dovrebbe passare a quello successivo.

+2

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 codificati). – GrandmasterB

+5

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

+0

@Vennsoh Non è necessario passare un elemento della coda 'successivo'. Puoi scegliere di utilizzare invece il metodo dequeue(): http://api.jquery.com/dequeue/ – gfullam

2

Il ritardo funziona su una coda. e per quanto ne so la manipolazione di css (oltre che tramite animate) non viene accodata.

44

AFAIK il metodo di ritardo funziona solo per le modifiche numeriche CSS.

destinato ad altri usi JavaScript viene fornito con un metodo setTimeout:

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

+1: Non usare Jquery per il bene di Jquery. Ci sono semplici soluzioni javascript per molti problemi. – Joel

+1

+1: proprio come il primo commento. Anche Simple JS funziona bene alcune volte. – wowpatrick

+1

+1 per semplicità, ma ha anche fatto +1 sulla risposta accettata - come mi ha fatto notare che il .queue() in realtà passa l'oggetto di continuazione che deve essere chiamato manualmente (il 'next()').Ho passato mezz'ora a chiedermi perché la mia catena di callback parametrici esegua solo il primo - molti esempi su altri siti usano un solo delay in catena e un callback parametrico, che è un po 'ingannevole semplificazione di quel meccanismo – quetzalcoatl

0

Prova questo:

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

manipolazione CSS di jQuery non è in coda, ma si può rendere eseguito all'interno della coda 'fx' facendo:

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

Piuttosto stessa cosa di setTimeout chiama ma usa invece il mecanismo delle code di jQuery.

1

Certo che sarebbe più semplice se si estende jQuery in questo modo:

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

dopo che è possibile utilizzare questa funzione come addClass:

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

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

+1

e se desideri aggiungere concatenare il supporto, leggere le nozioni di base sulla creazione di plugin o semplicemente aggiungere 'return this' alla funzione ... – user6322596

4

So che questo è un antichissimo post ma ho combinato alcune delle risposte in una funzione wrapper jQuery che supporta il concatenamento. La speranza avvantaggia 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 si può fare cose come questa - attendere 1 secondo, aggiungere .error, attendere 3secs, rimuovere .error:

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

+0

Molto utile! Grazie! –

Problemi correlati