Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/04/2011, 18:16
Avatar de masterpuppet
masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Problema con scope

Buenas,

A ver, estas sobreecribiendo, obj.fn, en cada iteracion y el tiempo que le estas asignando al timeout es muy bajo, un posible parche:

Código Javascript:
Ver original
  1. JSPlus.metodos({
  2.     'gradiente' : function(objeto) {
  3.  
  4.         var este = this, padre = JSPlus.Gradiente;
  5.  
  6.         var colores = objeto.colores;
  7.  
  8.         if(colores.constructor === Array) {
  9.  
  10.             objeto.duracion /= colores.length;
  11.  
  12.             for(var i = 1; sig = colores[i]; ++i) {
  13.  
  14.                 var obj = {}
  15.                 for(var p in padre.porDefecto) {
  16.                     obj[p] = objeto[p] || padre.porDefecto[p];
  17.                 }
  18.  
  19.                 var act = colores[i - 1];
  20.  
  21.                 obj.fn = function(I, F) {
  22.  
  23.                     return function(p) {
  24.  
  25.                         var cAct  = padre.separarColor(I);
  26.                         var difer = padre.calcularDiferencia(I, F);
  27.                         var objC  = padre.crearObjetoColor(
  28.                             parseInt(cAct.R) + difer.R * p,
  29.                             parseInt(cAct.G) + difer.G * p,
  30.                             parseInt(cAct.B) + difer.B * p
  31.                         );
  32.                         este.css(obj.prop, padre.RGBValido(objC));
  33.  
  34.                     };
  35.  
  36.                 }(act, sig);
  37.  
  38.                 var func = function() {
  39.                     este.gradienteEnCurso = 1;
  40.                     var trans = new JSPlus.Gradiente.Transicion(obj, este);
  41.                     trans.inicio();
  42.                 };
  43.  
  44.                 if(este.gradienteEnCurso == 1) {
  45.                     return setTimeout(function(){ func(); }, 3400);
  46.                 }
  47.  
  48.                 func();
  49.  
  50.             }
  51.  
  52.         }
  53.         return este;
  54.      }
  55. });

Esto tiene dos fallos grandes, el primero hace el merge dentro del loop, para solucionar esto deberías cambiar la implementacion de JSPlus.Gradiente.Transicion y separar el callback de las propiedades, el otro es setear un timeout para comprobar si el efecto se esta ejecutando, deberias implementar tu clase de eventos y poder asignarle custom events a tus clases, algo esencial para manejar efectos y colas de efectos, deberías poder hacer algo así:

Código Javascript:
Ver original
  1. new JSPlus.Gradiente.Transicion(el, {
  2.    onStart: function(){...},
  3.    onStep: function(){},
  4.    onComplete: function(){...}
  5. });

Te dejo un par de referencias:

http://www.nczonline.net/blog/2010/0...in-javascript/
http://www.geekdaily.net/2008/04/02/...custom-events/

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 29/04/2011 a las 18:23 Razón: typo