Foros del Web » Programando para Internet » Javascript »

Problema con funcion

Estas en el tema de Problema con funcion en el foro de Javascript en Foros del Web. Wenas.. Tengo problemas con el siguiente codigo Código: BG=document.createElement('div'); (..) Opacity(BG, 'Show', 1, 8, 40); ----------------------------------------------------------------------------------------------------- function Opacity(oF, Type, Start, End, Timing) { if (Type=='Hide') ...
  #1 (permalink)  
Antiguo 09/08/2008, 18:19
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Problema con funcion

Wenas..

Tengo problemas con el siguiente codigo

Código:
BG=document.createElement('div');
(..)
Opacity(BG, 'Show', 1, 8, 40);

-----------------------------------------------------------------------------------------------------

function Opacity(oF, Type, Start, End, Timing)
{
	if (Type=='Hide')
	{
		time=1;
		for (o=Start; o>=End; o--)
		{
			if (NS)	setTimeout("oF.style.opacity="+o+"/10",time*Timing);
			else setTimeout("oF.style.filter='alpha(opacity='"+(o*10)+"')'",time*Timing);
			++time;
		}
	}
	else
	{
		time=1;
		for (o=Start; o<=End; o++)
		{
			if (NS)	setTimeout("oF.style.opacity="+o+"/10",time*Timing);
			else setTimeout("oF.style.filter='alpha(opacity='"+(o*10)+"')'",time*Timing);
			++time;
		}
	}
}
El FB me tira: oF is not defined

Probe con getElementById...
osea..
BG.id='id';
Opacity(BG.id,...);
y luego el get dentro de la funcion....

Pero nada... igual creo que asi deberia de andar igual...

saludos
  #2 (permalink)  
Antiguo 10/08/2008, 08:18
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problema con funcion

Hola Fernand0:

Creo que ahí debes utilizar un closure:

setTimeout( function() { oF.style.opacity=o/10; } ,time*Timing);

Ya que tu variable oF no estará disponible fuera de la función Opacity().

Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 10/08/2008, 08:43
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con funcion

gracias derkenuke T_T
  #4 (permalink)  
Antiguo 10/08/2008, 09:39
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con funcion

no anda bien con el closure :S

o sea.. ANDAR.. anda.. pero no bien... a veces me tira hasta 100% de opacity otras hasta End... y despues el Time no funciona... directamente se va a End sin intermediario :S
  #5 (permalink)  
Antiguo 12/08/2008, 01:40
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con funcion

auxilio :(
  #6 (permalink)  
Antiguo 12/08/2008, 02:49
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con funcion

Imagina un grupo de 10 amigos. Tú quieres que cada uno entre a la habitación diga una palabra a un micrófono y luego salga de la habitación. Al final, deberá quedar grabada una frase.

Entonces tú haces esto:
A cada uno de los amigos le dices una palabra y le dices exactamente a qué hora debe entrar en la habitación. El primero entra a las 0:00:00, el segundo entra a las 0:00:05, el tercero entra a las 0:00:10, y así sucesivamente. Les das las palabras y los tiempos y ¡adelante!

Dejas pasar el rato y vas a ver la grabación. Lo que ves es que algunas palabras están en orden, otras no. La frase no tiene sentido.

Resulta que tu segundo amigo tardó un poco más de lo previsto porque su palabra era más larga y el tercero dijo la suya encima de la del segundo. El cuarto se tropezó con una silla y el quinto habló antes que él.


¿Cuál es el problema? Realmente tú lo que querías no era que el primero entrara a las 0:00:00, el segundo a 0:00:05, el tercero a 0:00:10, etc. Tú calculaste que más o menos con 5 segundos estaría bien y que si les decías esos tiempos, entonces hablarían en orden y con una separación igual todos.
Pero lo que realmente querías es que las palabras quedaran en orden. Lo que tenías que decirle a cada uno es: "Entra cuando salga el anterior".


Igual que eso, estás lanzando 8 setTimeouts en tu bucle con intervalos determinados. Peor aún! Lo que tú estás haciendo no es decir "entra a las 0:00:15" si no que al tercero le dices "Entra dentro de 15 segundos", pero en realidad ya han pasado algunos segundos desde que le dijiste al primero que entrara.

¿Qué es lo que debes hacer? Lanzar un setTimeout cada vez, y sólo uno. Ese, cuando le toque ejecutarse modificará la opacidad un poco y será el encargado de lanzar otro setTimeout.

Es decir... En una versión simplificada podría ser algo así:

Código:
function Opacity(objeto, inicio, final, duracion) {
    function pasoSiguiente(obj, actual, inc, t, fin) {
        nuevo = actual + inc;
        obj.style.opacity = nuevo;
        if ( (nuevo) < fin ) {
            setTimeout(function() { pasoSiguiente(obj,nuevo,inc,t,fin); }, t);
        }
    }

    tiempo = 100; // cada 100 milisegundos un paso
    incremento = (final - inicio) / (duracion*1000/tiempo);
    setTimeout(function() { pasoSiguiente(objeto,inicio,incremento,tiempo,final); }, tiempo);
}
Tendrás que adaptarlo a tu necesidad, claro.
  #7 (permalink)  
Antiguo 12/08/2008, 20:07
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con funcion

Muchas gracias anduvo perfect.. pero.....

O sea.. yo lo hacia de la misma manera antes.. pero sin function...

Encajaba un WHILE directamente con el objeto a transparentar.. y andaba mas que perfecto... ahora por alguna extraña razon con esa funcion no anda... porque el WHILE sigue siendo el mismo...

no me cierra :/

Cita:
Lo que tú estás haciendo no es decir "entra a las 0:00:15" si no que al tercero le dices "Entra dentro de 15 segundos", pero en realidad ya han pasado algunos segundos desde que le dijiste al primero que entrara.
Am.. tengo que entender eso como un "error/capricho" de JS? porque para algo estan los ciclos.. para que anden bien

gracias por la explicacion.. muy amable

saludos
  #8 (permalink)  
Antiguo 13/08/2008, 00:17
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con funcion

Cita:
Am.. tengo que entender eso como un "error/capricho" de JS? porque para algo estan los ciclos.. para que anden bien
No. Pero deberías tener en cuenta que esto no es un sistema de tiempo real. Que además de que Javascript no te garantice tiempos exactos y/o predecibles, también hay otro subsistema que es el navegador, que tiene que redibujar lo que tú dices desde Javascript. Ese tampoco es un sistema de tiempo real.

No es ni error ni capricho. Simplemente no todos los sistemas de programación garantizan tiempo real. Y desde luego con un lenguaje interpretado y embebido en un sistema como es un navegador, no sueñes con tener ningún tipo de control sobre ciclos.
  #9 (permalink)  
Antiguo 13/08/2008, 00:47
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con funcion

entiendo.. gracias
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 00:37.