Foros del Web » Programando para Internet » Javascript »

Transición que no funciona

Estas en el tema de Transición que no funciona en el foro de Javascript en Foros del Web. Bueno amigos pues aquí ando, intentando hacer una función para transiciones. Resulta que el otro día me topé con este (excelente) artículo de @Panino y ...
  #1 (permalink)  
Antiguo 27/03/2011, 07:48
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Transición que no funciona

Bueno amigos pues aquí ando, intentando hacer una función para transiciones. Resulta que el otro día me topé con este (excelente) artículo de @Panino y me di cuenta de que lo estaba haciendo mal, así que me puse a adaptar su código a lo que necesitaba... pero no funcionó Antes por lo menos la consola de errores me marcaba los errores, valga la redundancia, pero ahora ni eso, simplemente no funciona. Dejo el código a ver si me podéis ayudar XD
Código Javascript:
Ver original
  1. Object.prototype.clonar = function(){
  2.  var clon = {};
  3.  clon.prototype = this.prototype;
  4.  for(var i in this){
  5.   clon[i] = this[i];
  6.  }
  7.  return clon;
  8. };
  9.  
  10. Object.prototype.calcar = function(obj){
  11.  var clon = {};
  12.  clon.prototype = this.prototype;
  13.  for(var i in this){
  14.   clon[i] = this[i];
  15.  }
  16.  for(var i in obj){
  17.   clon[i] = obj[i];
  18.  }
  19.  return clon;
  20. };
  21.  
  22. JSPlus.Fx = {};
  23.  
  24. JSPlus.Fx.Efectos = {}
  25. /* Aquí están todas las funciones,
  26. *  no las pongo porque es muy largo
  27. */
  28.  
  29. JSPlus.Fx.porDefecto = {
  30.  'Opciones' : {
  31.   'duracion' : 1000,
  32.   'curva' : 'lineal',
  33.   'intervalo' : 20,
  34.   'unidad' : 'px'
  35.  }
  36. };
  37.  
  38. JSPlus.Fx.Transicion = function(obj, opc){
  39.  var este = this;
  40.  this.fin = 0;
  41.  this.start = new Date().getTime();
  42.  this.inicio = function(){
  43.   setTimeout(function(){
  44.    var step = este.paso();
  45.    if(!step){
  46.     obj.fn(1);
  47.     este.fin = 1;
  48.     window.globalIntervalo = 0;
  49.     return;
  50.    }
  51.    obj.fn(step);
  52.    este.inicio();
  53.   }, opc.intervalo);
  54.  };
  55.  this.paso = function(){
  56.   var now = new Date().getTime();
  57.   return (now - this.start < opc.duracion) && opc.curva(now - this.start);
  58.  };
  59. }
  60.  
  61. JSPlus.metodos({
  62.  'FX' : function(objeto, opciones){
  63.   var fx = JSPlus.Fx, este = P(this);
  64.   for(var i in objeto){ // tipo [desde, hasta]
  65.    var prop = objeto[i];
  66.    if(!/(string|number)/i.test(typeof prop)) continue; // !(function, array, object, ...)
  67.    objeto[i] = [este.getStyle(i), prop]; // [desde[ahora], hasta]
  68.   };
  69.   var obj = objeto.clonar(), opc = (opciones || {}).calcar(fx.porDefecto.Opciones); // setea sólo si no se declaran
  70.   if(typeof opc.curva === 'array'){ // parche -> lineal(p), reboteG(n)(p)
  71.    opc.curva = fx.Efectos[opc.curva[0]](opc.curva[1]);
  72.   }else{
  73.    opc.curva = fx.Efectos[opc.curva];
  74.   }
  75.   obj.fn = function(p){ // paso
  76.    for(var i in obj){
  77.     act = obj[i];
  78.     if(!/array/i.test(typeof act)) continue; // sólo arrays
  79.     var ini = parseFloat(act[0]), fin = parseFloat(act[1]);
  80.     var difer = Math.abs(ini - fin), prop = i.toLowerCase();
  81.     var dvlp = (ini + p * difer) + ((act[1].toString().match(/[A-z]+$/) || [])[0] || opc.unidad); // si hay unidad declarada se usa esa
  82.     console.log(dvlp); // Esto no llega a mostrarse
  83.     este.css('position', 'absolute').css(prop, dvlp);
  84.     if(prop == 'opacity'){ este.opacity(ini + p * difer); } // si es opacity no lleva unidad
  85.    }
  86.   };
  87.   JSPlus.escribir(obj); // console.log
  88.   var trans = new JSPlus.Fx.Transicion(obj, opc);
  89.   trans.inicio();
  90.   trans = null;
  91.   return P(this);
  92.  }
  93. });
Y lo llamo así:
Código Javascript:
Ver original
  1. P('#ejemplo').FX({
  2.  'left' : 100,
  3.  'width' : '500px',
  4.  opacity : 0.5,
  5. }, {
  6.  'duracion' : 1000,
  7.  'curva' :  ['reboteG', 3]
  8. });
Saludos y gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 27/03/2011, 17:46
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Transición que no funciona

que tal cronos!

veras, no logro hacer las pruebas. primero que el codigo esta incompleto. tuve que buscar parte del codigo en un tema anterior. pero lo adecuado es que indiques un enlace donde descargar el codigo mas reciente. asi no tienes que copiarlo todo aqui. en fin, al intentar hacer el ejemplo la consola me indica que el metodo escribir no esta definido. de ahi no puedo avanzar porque no tengo idea que hace ese metodo.

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 27/03/2011, 21:18
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Transición que no funciona

otros apuntes...

el metodo calcar no me hace sentido, especialmente cuando se le pasa como parametro las opciones a FX. ¿calcar no deberia solamente asignar las propiedades faltante? en la linea #13 y #16, fijate que el orden es incorrecto. es decir, primero estas copiando las propiedades del objeto original y luego copias las propiedades del objeto por defecto. en este segundo bucle, las propiedades por defecto sobreescriben al original. deberia ser al reves. el codigo tambien se puede mejorar de otra forma. en lugar de crear un objeto desde cero e ir copiando las propiedades, puedes revisar si algunas de las propiedades esta definida. en caso de no estar definida, la creas.
Código:
Object.prototype.trace = function(_default){
for(var prop in _default) if(!(prop in this)) this[prop] = _default[prop];
}
adicionalmente, los objetos no tiene la propiedad prototype, este le pertenece a las funciones. por lo que al calcar el objeto estas asignando una propiedad indefinida al objeto original.

por otro lado, en la linea #70 tienes un error de comparacion. los arrays devuelven el string 'object' cuando se utiliza el operador typeof. para determinar si una propiedad es un array debes comparar los constructores.
Código:
var array = [];
console.log(array.constructor === Array);
sin embargo, no comprendo el proposito de esa linea puesto que al evaluarse, se invoca una funcion que no existe en el objeto Efectos. de igual forma, el else de la condicion sobre escribe la propiedad curva del objeto opc con valor undefined. como resultado, en la linea #57 se intenta invocar curva como funcion cuando en realidad el valor es undefined. en fin, probablemente sea porque no has puesto las funciones que has omitido.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 27/03/2011 a las 22:31
  #4 (permalink)  
Antiguo 28/03/2011, 10:41
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Transición que no funciona

Cita:
Iniciado por zerokilled
veras, no logro hacer las pruebas. primero que el codigo esta incompleto. tuve que buscar parte del codigo en un tema anterior
Lo siento, no se me ocurrió pensar que los demás no tenían el archivo completo XD
Cita:
Iniciado por zerokilled
en la linea #13 y #16, fijate que el orden es incorrecto
Cierto

Cita:
Iniciado por zerokilled
por otro lado, en la linea #70 tienes un error de comparacion. los arrays devuelven el string 'object' cuando se utiliza el operador typeof.
Pues es verdad, no me había dado cuenta O.O

Cita:
Iniciado por zerokilled
sin embargo, no comprendo el proposito de esa linea puesto que al evaluarse, se invoca una funcion que no existe en el objeto Efectos
Sí existe pero para abreviar el código no puse las funciones que usaba.

Ahora en el ejemplo si haces click en el enlace me dice:
Cita:
Iniciado por FF
Error: opc.curva is not a function
Cita:
Iniciado por Chrome
Uncaught TypeError: Property 'curva' of object #<an Object> is not a function
¿Cómo puedo indicarle que es una referencia?
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #5 (permalink)  
Antiguo 28/03/2011, 13:41
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Transición que no funciona

lo que puedo ver es que aun tienes problema con el la comparacion del array. cuando le pasas un array en las opciones de FX, el else se evalua asignando una propiedad que no existe en el objeto Efect. recuerda que debes comparar por el constructor. note que no se produce ningun error si en lugar de un array el valor fuera un string.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 29/03/2011, 14:16
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Transición que no funciona

Ahora me doy cuenta de que el problema también está en las funciones del efecto, me dan auténticas burradas de resultados XD Lo tengo así para ver los resultados:
Código Javascript:
Ver original
  1. var dvlp = Math.abs(ini + p * difer) + ((act[1].toString().match(/[A-z]+$/) || [])[0] || opc.unidad);
  2. console.log(dvlp);
Y sale 30000px, o 80000px, dependiendo de la vez, pero no consigo ver dónde está el fallo :/ Además de eso, en Chrome me da un error en String.js, creo que es un problema del hosting que me inserta código, pero en FF no me pasa. ¿Cómo puedo solucionarlo?
Saludos (:
Edit: Ok, mea culpa, se me pasó un trozo de código de @Panino XD De momento funciona medianamente bien, si tengo más problemas ya los posteo.
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Última edición por _cronos2; 29/03/2011 a las 15:46
  #7 (permalink)  
Antiguo 31/03/2011, 13:42
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Transición que no funciona

Bueno muchas gracias a todos los que me han ayudado, a @masterpuppet por guiarme al principio, a @Panino por darme la base del código, y a @ZK por ayudarme en el desarrollo XD
Aquí hay un ejemplo básico y cutre del código final En FF tengo algunos problemas con que la transición va a saltos pero creo que es problema de que tengo el PC sobrecargado XD En IE ni lo probé, supongo que la parte del CSS no funcionará pero el efecto debería.
Saludos y gracias otra vez :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:25.