Algo tan simple como: no parece trabajarjQuery: ¿Puedo llamar a delay() entre addClass() y tal?
$("#div").addClass("error").delay(1000).removeClass("error");
. ¿Cuál sería la alternativa más fácil?
Algo tan simple como: no parece trabajarjQuery: ¿Puedo llamar a delay() entre addClass() y tal?
$("#div").addClass("error").delay(1000).removeClass("error");
. ¿Cuál sería la alternativa más fácil?
Se puede crear un nuevo elemento de cola para hacer su eliminación de la clase:
$("#div").addClass("error").delay(1000).queue(function(next){
$(this).removeClass("error");
next();
});
o utilizando el método dequeue:
$("#div").addClass("error").delay(1000).queue(function(){
$(this).removeClass("error").dequeue();
});
El motivo por el que necesita llamar al next
o dequeue
es para que jQuery sepa que ha terminado con este elemento en cola y que debe pasar al siguiente.
Me gusta esta opción porque hace que sea fácil pasar una referencia al objeto jquery que se usa en la función en cola, por lo que se puede usar en un contexto más genérico (sin nombres codificados). – GrandmasterB
¿Por qué necesitamos "siguiente"? ¿Podemos hacer $ ("# div"). AddClass ("error"). Delay (1000) .queue (function() { $ (this) .removeClass ("error"); }); Parece más elegante? – Vennsoh
@Vennsoh No es necesario pasar un elemento de la cola 'siguiente'. Puede optar por usar el método dequeue() en su lugar: http://api.jquery.com/dequeue/ – gfullam
El retraso funciona en una cola. y, por lo que sé, la manipulación css (que no sea a través de animate) no está en cola.
AFAIK el método de demora solo funciona para modificaciones numéricas de CSS.
Para otros fines JavaScript viene con un método setTimeout:
window.setTimeout(function(){$("#div").removeClass("error");}, 1000);
+1: No use Jquery para Jquery. Hay soluciones simples de JavaScript para muchos problemas. – Joel
+1: Lo mismo que el primer comentario. Simple JS también funciona bien algunas veces. – wowpatrick
+1 por simplicidad, pero también a +1 en la respuesta aceptada, ya que me indicó que el .queue() en realidad pasa el objeto de continuación que debe llamarse manualmente (el 'siguiente()').Me he pasado la mitad de la hora preguntándome por qué mi cadena de devoluciones de llamada sin parámetros ejecuta solo la primera: muchos ejemplos en otros sitios usan un único retraso en la cadena y una devolución de llamada sin parámetros, lo cual es una simplificación excesiva de ese mecanismo – quetzalcoatl
Prueba esto:
function removeClassDelayed(jqObj, c, to) {
setTimeout(function() { jqObj.removeClass(c); }, to);
}
removeClassDelayed($("#div"), "error", 1000);
manipulación CSS jQuery no está en la cola, pero se puede hacer que sea ejecutado en el interior de la cola 'FX' haciendo:
$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });
Muy mismo que setTimeout llamando pero en su lugar usa el mecanismo de cola de jQuery.
Por supuesto que sería más sencillo si se amplía jQuery así:
$.fn.addClassDelay = function(className,delay) {
var $addClassDelayElement = $(this), $addClassName = className;
$addClassDelayElement.addClass($addClassName);
setTimeout(function(){
$addClassDelayElement.removeClass($addClassName);
},delay);
};
después de que se puede utilizar esta función como addClass:
$('div').addClassDelay('clicked',1000);
https://learn.jquery.com/plugins/basic-plugin-creation/ – user6322596
y si desea agregar encadenando soporte, lea los conceptos básicos sobre la creación de complementos, o simplemente agregue 'return this' a la función ... – user6322596
Sé que esto se trata de una muy antigua publicar pero he combinado algunas de las respuestas en una función de envoltorio jQuery que admite el encadenamiento. Espero que beneficia a alguien:
$.fn.queueAddClass = function(className) {
this.queue('fx', function(next) {
$(this).addClass(className);
next();
});
return this;
};
Y aquí está un envoltorio removeClass:
$.fn.queueRemoveClass = function(className) {
this.queue('fx', function(next) {
$(this).removeClass(className);
next();
});
return this;
};
Ahora usted puede hacer cosas como esta - espere 1 segundo, añadir .error
, espere 3secs, retire .error
:
$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
¡Muy útil! ¡Gracias! –
quería hacer exactamente lo mismo. Sería genial llamar a '$ (" # div "). AddClassTemporarily (" error ", 1000)' –