2012-01-09 11 views
38

Si selecciona una clase o colección de elementos para animar con jQuery:

$('.myElems').animate({....}); 

Y luego también utiliza la función de devolución de llamada, que terminan con una muchas llamadas innecesarias animate().

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
     i++; 
    }); 
}); 

Podría decirse que esto es sólo un mal código y/o el diseño - Pero, ¿hay algo que pueda hacer que tanto evita tener muchos animate() llamadas con sólo uno de ellos mediante la devolución de llamada, y que tiene una carga de devoluciones de llamadas innecesarias de ejecución y atornillar con mi código/comportamiento esperado?

Idealmente, solo podría codificar una única devolución de llamada 'desechable' que solo se ejecutará una vez; de lo contrario, tal vez haya una manera eficiente de comprobar si algo ya está siendo animado por jQuery.

Ejemplo: http://jsfiddle.net/uzSE6/ (advertencia: esto mostrará una carga de cuadros de alerta).

+0

definen una variable de indicador en el alcance del archivo o en algún lugar accesible por 'animate()'. compruébalo antes de '$ (" # algunaOtraElema '). animate() 'llámalo y configúralo en su cuerpo para que' $ ("# algunaOtraElema'). animate()' no se invoque la próxima vez. – fardjad

Respuesta

99

usted podría utilizar como when:

$.when($('.myElems').animate({width: 200}, 200)).then(function() { 
    console.log('foo'); 
}); 

http://jsfiddle.net/tyqZq/

Alterna te versión:

$('.myElems').animate({width: 200}, 200).promise().done(function() { 
    console.log('foo'); 
}); 
+7

Me gusta esto. Esto me gusta mucho. No sabía acerca de estas funciones, esto ayudó mucho :) – jammypeach

+5

+1 Lo encontré bastante útil para '$ ('html, body'). Animate (...)' – Alvaro

2

Puede crear una variable para bloquear segunda devolución de llamada + ...

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) return; 
     else 
     { 
      console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
      i++; 
     } 
    }); 
}); 

Esto sólo se disparará una vez como cada devolución de llamada posterior obtendrá cancelado :)

+3

Sugiero usar un nombre de variable diferente de 'i', que es común y es probable que se sobrescriba accidentalmente, y establecerlo en 'true' o' false' en su lugar para mayor claridad. – Blazemonger

+1

^Claro, pero lo usé porque ya estaba disponible en el código de ejemplo, lo utilicé ligeramente ajustado. Desde el punto de vista de la claridad, algo así como 'callbackdone' establecido en valores booleanos tendría mucho más sentido. – bardiir

Cuestiones relacionadas