Foros del Web » Programando para Internet » Javascript »

Método como argumento de setTimeout

Estas en el tema de Método como argumento de setTimeout en el foro de Javascript en Foros del Web. Hola a todos y gracias por de antemano por atenderme. Estoy escribiendo un sencillo código JavaScript para mostrar texto con un efecto de movimiento. Para ...
  #1 (permalink)  
Antiguo 12/07/2006, 11:19
 
Fecha de Ingreso: julio-2006
Mensajes: 4
Antigüedad: 18 años, 4 meses
Puntos: 0
Método como argumento de setTimeout

Hola a todos y gracias por de antemano por atenderme.

Estoy escribiendo un sencillo código JavaScript para mostrar texto con un efecto de

movimiento. Para ello he creado una clase llamada Text de la siguiente forma:

//constructor
function Text (html_object, speed, wait_paragrah, repeat, wait_repeat){
//atributos privados
this.text = new Array();
this.iparagrah = 0; //Paragrah index
this.ichar = -1; //Char index
this.paragrahShowed = '';
this.timesShowed = 0; //Number of times text showed
//atributos públicos
this.htmlObject = html_object;
this.speed = speed; //Speed char show
this.waitParagrah = wait_paragrah; //Wait until next paragrah
if (repeat > -1){
this.repeat = repeat; //Repeat text n times; 0 value, repeat always
}
this.waitRepeat = wait_repeat; //Wait until repeat text
//métodos
this.Reset = Reset;
this.Insert = Insert;
this.Show = Show;
}

Como podeis ver la clase define 3 métodos, entre ellos y que más me interesa Show, que

muestra el texto en pantalla.

El código que estoy desarrollando para dicha función se encuentra en este punto...

function Show (){
var paragrah_temp = '';

while (this.iparagrah < this.text.length){
if (this.ichar < (this.text[this.iparagrah].length - 1)){
this.ichar++;
paragrah_temp = this.text[this.iparagrah];
paragrah_temp = paragrah_temp.split('');
this.paragrahShowed = this.paragrahShowed + paragrah_temp[this.ichar];
document.getElementById(this.htmlObject).innerHTML =

this.paragrahShowed;
setTimeout("this.Show()",this.speed);
return;
}
this.iparagrah++;
this.ichar = -1;
this.paragrahShowed = '';
setTimeout("this.Show();",this.waitParagrah);
this.Show();
return;
}
this.iparagrah = 0;
this.ichar = -1;
this.paragrahShowed = '';
if (this.repeat > 0){
this.timesShowed++;
if (this.timesShowed < this.repeat){
setTimeout("this.Show();",this.waitRepeat);
return;
}
} else{
setTimeout("this.Show();",this.waitRepeat);
return;
}
}


Mi problema es que el paso del método this.Show() como argumento de setTimeout no

funciona. He probado mil y una formas de hacerlo, como por ejemplo:

1. Definir una función nada() sin instrucciones y hacer lo siguiente.
setTimeout("nada();",this.speed);
this.Show();
return;

La función nada() tiene sentido como retardo en la ejecución de las posteriores

instrucciones.

2. Disasociar el objeto de la llamada al objeto
setTimeout("show(this);",this.speed);
return;
function show(object){
object.Show();
}

3. He probado también con distintas formas en la sintáxis de llamada
setTimeout("+this.Show();",this.speed);

Agradecería sinceramente cualquier tipo de ayuda o comentario.

Gracias a todos
  #2 (permalink)  
Antiguo 12/07/2006, 11:35
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Hola:

La verdad es que yo también probé cosas similares, y es bastante difícil.

En el menú de mi página uso un efecto de transición por ítem del menú, y tuve que hacer auténticos malavares...: http://www.caricatos.net/
Lo que hice es pasar el nombre del menú como uno de los parámetros de la creación del objeto:
function clasemenu(nombre,...
this.nombre = nombre;
...

var menu = new clasemenu("menu",...

Luego uso en la recursión el nombre del menu haciéndolo colgar del objeto window:
window[this.nombre]...

Es algo complejo, pero es la única forma que logré el objetivo.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 12/07/2006, 12:44
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 20 años, 4 meses
Puntos: 4
a ver asi..

function miObjeto() {
var me = this;
this.metodo1 = function() { alert('hola!'); };
setTimeout(me.metodo1, "2000");
}
__________________
Internet Explorer SuckS
Download FireFox
  #4 (permalink)  
Antiguo 12/07/2006, 14:10
 
Fecha de Ingreso: julio-2006
Mensajes: 4
Antigüedad: 18 años, 4 meses
Puntos: 0
Para concretizar más el problema... sabemos que la función setTimeout ejecuta una sola vez las instrucciones que se pasan como primer argumento, una vez haya transcurrido el tiempo marcado en el segundo argumento. Existe un tercer argumento opcional.

Por ejemplo:
setTimeout("count++';",2000);
Pasados 2 seg. nos redirecciona a la página indicada.

Si las instrucciones que queremos ejecutar incluyen una función con paso de variables, podemos hacerlo del siguiente modo.

setTimeout("nombrefuncion(" + nombrevar + ")",tiempo); //nótese el uso de las comillas

En el código que estoy generando, lo que no funciona es el paso del primer parámetro, que no es más que un método de un objeto sin argumentos.

He probado haciendo

setTimeout(this.Show(), 200); //nótese sin comillas

la llamada la hace correctamente pero no respeta el tiempo de retardo, 200 msegs.

Tampoco funciona por ejemplo

setTimeout(this.+"Show();", 200);

No se pueden existir limitaciones con el paso de objetos.

caricatos
He visto tu web... lo siento pero no he llegado a entender bien tu propuesta. ¿Puedes aclararmela, por favor?

SiR.CARAJ0DIDA
La llamada a la función Show() es recursiva por lo que no puedo redefinir el método dentro de sí misma, ¿no crees? Otra cosa, ¿qué inconveniente tiene usar en tu código el propio this en lugar de me? Y por último, ¿por qué 2000 lo entrecomillas? Quizás haya cosas que se me escapan...

Sigo investigando... 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 18:25.