Foros del Web » Programando para Internet » Javascript »

problema con js this y settimeout

Estas en el tema de problema con js this y settimeout en el foro de Javascript en Foros del Web. Hola, estoy tratando de crear funciones que me sirvan sin importar el id del elemento por ahora estoy comenzando a trabajar con una que despliega ...
  #1 (permalink)  
Antiguo 12/01/2009, 15:08
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
problema con js this y settimeout

Hola, estoy tratando de crear funciones que me sirvan sin importar el id del elemento por ahora estoy comenzando a trabajar con una que despliega divs, en la versión que hice primero con paso de argumentos, lo he logrado, son independientes y no me generan problemas, bueno algunos que he sabido solucionar. Pero el problema viene cuando intento hacerlo con controladores de eventos semánticos.

Todo funciona bien, cojo los valores que antes se me pasaba por argumento, jalandolos de los atributos de los elementos de lista con DOM. Pero cuando uso el settimeout es que tengo problemas, puesto que no me reconoce el valor de la variable que uso para establecer la id, bueno, no me explico bien creo, asi que dejo el código para que lo vean y me digan en que fallo.

Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Pruebas</title>
<script src="js/lib.js" type="text/javascript"></script>
<link rel="stylesheet" href="css/lib.css" type="text/css" />
<script type="text/javascript">
window.onload = function(){
var listado = document.getElementById('lista').getElementsByTagName('li');
var tamer = this.titlae;
tamara = this.value;
for(var i=0; i<listado.length; i++) {
    
      listado[i].onclick = despliegasema;
    }
}
</script>

</head>
<body>
<div id="container">
<div id="lista">
<ul>
<li onClick="javascript:esconder();">esconder elementos de lista</li>
<li id="uno" title="desplegableuno" value="150" >despliega el primero</li>
<li title="desplegabledos" value="140" >despliega el segundo</li>
<li title="desplegabletres" value="160" >despliega el tercero</li>
<li title="desplegablecuatro" value="250" >despliega el cuarto</li>
<li title="desplegablecinco" value="100" >despliega el quinto</li>
<li title="desplegableseis" value="200" >despliega el sexto</li>
</ul>
</div>
<div id="listo">
<ul>
<li>no me borro</li>
<li>no me borro</li>
<li>no me borro</li>
</ul>
</div>
<div id="desplegableuno" >
<p>uno</p>
</div>
<div id="desplegabledos" >
<p>dos</p>
</div>
<div id="desplegabletres" >
<p>tres</p>
</div>
<div id="desplegablecuatro" >
<p>cuatro</p>
</div>
<div id="desplegablecinco" >
<p>cinco</p>
</div>
<div id="desplegableseis" >
<p>seis</p>
</div>
</div>
</body>
</html>
Código:
tama = 0;

function despliegasema() {
var tamer = this.title;
var tamara = this.value;

tama+=10;
if(!(tama>=tamara)){

document.getElementById(tamer).style.height = tama + 'px';


}
window.setTimeout('despliegasema()',10);
}
en la versión en que uso argumentos, tamer y tamara, son los argumentos que obtengo de la llamada, y tama es una variable global que uso para inicializar pero que luego uso en otra función que une esta, a otra que repliega los divs.

Gracias por su ayuda.

Pd.- el problema está en el settimeout, porque cuando lo quito funciona, pero solo la primera parte, ya que no hace el timeout.
  #2 (permalink)  
Antiguo 13/01/2009, 08:44
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Vaya, parece que no soy muy popular -.-.
  #3 (permalink)  
Antiguo 13/01/2009, 09:28
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Lo has verificado para errores (se puede hacer en IE y FF) de aquí veo uno rápido:

Código:
var tamer = this.titlae;
del primer código.
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #4 (permalink)  
Antiguo 13/01/2009, 11:31
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Ah sorry, ese fue un error de copia =( no está en el código original.
  #5 (permalink)  
Antiguo 13/01/2009, 11:59
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

So lo probaste en firefox para ver si muestra algún error en la consola de errores al ejecutares??
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #6 (permalink)  
Antiguo 13/01/2009, 12:24
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Claro, también con el firebug, en la primera vuelta no encuentra errores, pero en la segunda al aplicarse ya el settimeout, no reconocer la variable tamer, y más aún, aunque como ves la llamo con DOM, no la considera, debe ser un problema con el settimeout :( también sería chvr saber como puedo pasar argumentos en manejadores de eventos semánticos.
  #7 (permalink)  
Antiguo 13/01/2009, 16:37
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Pues si es así lo único que puedo pensar con el código limitado que colocaste solo pienso que no sera los paréntesis que hay alrededor del función conviertiendolo en variable? No veo mas nada raro con tu código.
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #8 (permalink)  
Antiguo 13/01/2009, 17:25
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Hahahaha voy a revisarlo bien en casa, pero el código limitado ese que está ahí es practicamente todo el código, xD con parametros funciona cañon, estoy tratando de hacer el mínimo de código para las funciones.

Como extraño a Caricatos, que ha sido de él?

Pd.- Bonito el blog, yo también tengo una página que me he creado de cero y que voy armandola cuando me da tiempo libre el trabajo.

http://remsr.com
  #9 (permalink)  
Antiguo 13/01/2009, 17:29
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: problema con js this y settimeout

Probá así:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
title>Pruebas</title>
<
link rel="stylesheet" href="css/lib.css" type="text/css" />
<
script type="text/javascript">
var 
tama 0;
function 
despliegasema(e) {
var 
tamer this.title;
var 
tamara this.value;
tama+=10;
if(!(
tama>=tamara)){

document.getElementById(tamer).style.height tama 'px';


}
var 
_this=this
window
.setTimeout(function(e){despliegasema.call(_this,e);},10);
}
window.onload = function(){
var 
listado document.getElementById('lista').getElementsByTagName('li');
for(var 
i=1i<listado.lengthi++) {
   (function(){
    var 
_i=i;
      
listado[i].onclick = function(e){despliegasema.call(listado[_i],e);}
     })()
    }
}
</script>

</head>
<body>
<div id="container">
<div id="lista">
<ul>
<li onclick="javascript:esconder();">esconder elementos de lista</li>
<li id="uno" title="desplegableuno" value="150" >despliega el primero</li>
<li title="desplegabledos" value="140" >despliega el segundo</li>
<li title="desplegabletres" value="160" >despliega el tercero</li>
<li title="desplegablecuatro" value="250" >despliega el cuarto</li>
<li title="desplegablecinco" value="100" >despliega el quinto</li>
<li title="desplegableseis" value="200" >despliega el sexto</li>
</ul>
</div>
<div id="listo">
<ul>
<li>no me borro</li>
<li>no me borro</li>
<li>no me borro</li>
</ul>
</div>
<div id="desplegableuno" >
<p>uno</p>
</div>
<div id="desplegabledos" >
<p>dos</p>
</div>
<div id="desplegabletres" >
<p>tres</p>
</div>
<div id="desplegablecuatro" >
<p>cuatro</p>
</div>
<div id="desplegablecinco" >
<p>cinco</p>
</div>
<div id="desplegableseis" >
<p>seis</p>
</div>
</div>
</body>
</html> 
  #10 (permalink)  
Antiguo 13/01/2009, 20:45
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Muchas gracias por tu apoyo, aunque no es exactamente lo que estaba buscando, ahi haces cosas que aùn no sè, probablemente porque usas call, ya debes haber visto objeto y clase no? debo ver eso tambièn, podrìas explicarme un poco tu código, para aprender bien, por ejemplo la e que pones, es un argumento? cuando lo pasas?.

Lo que quiero lograr es algo semàntico, pero que sea externo al documento html, he logrado lo que querìa pasando argumentos, pero no se como pasar argumentos en un manejador de eventos semàntico, lo sè, aùn me queda mucho por aprender pero espero estar haciendolo en el camino correcto.

Por lo pronto tengo esta funciòn pero la consigo pasando argumentos:

http://remsr.com/experimentos/index.html

Reutilizo la misma función para todos los llamados.

Muchas gracias!!
  #11 (permalink)  
Antiguo 13/01/2009, 22:06
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: problema con js this y settimeout

Confundís un poco algunos conceptos, según entiendo. La semántica en web se relaciona más bien con esto: http://es.wikipedia.org/wiki/Web_sem%C3%A1ntica. Creo que lo que estás tratando de hacer es usar lo que está de moda llamar javascript no invasivo, que consiste en separar el código javascript del html.
Bueno, la e, que viste en el código está relacionada con el objeto event, que tiene varios usos, entre ellos, determinar cuál es elemento que lanza el evento. Igualmente, en el ejemplo que te dejé no es necesario incluirlo, aunque en otros casos sí puede ser útil. Para pasar argumentos en ese tipo de llamadas a funciones, lo que se puede hacer es envolver la función que requiere argumentos dentro de una función anónima. Ejemplo:
Código PHP:
function hacer(algo){alert(algo);}
document.getElementById('pp').onclick=function(){hacer('esto');} 
Aunque, también sería bueno, en lugar de usar ese tipo de asignación, usar uno más potente, que es la asignación de eventos vía DOM. Pero ese tipo de asignaciones es más complejo, ya que se hace de manera diferente para explorer y para el resto de los navegadores. Si querés aprender acerca de eso, te recomiendo que leas esto: http://kusor.net/traducciones/brainj...vents1.es.html
Otra cosa que deberías leer sería esta: http://www.dustindiaz.com/javascript-no-no/
  #12 (permalink)  
Antiguo 14/01/2009, 08:04
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Gracias por los ejemplos, si creo que confundí los términos porque en el libro que leo se les da ese nombre "manejadores de eventos semánticos" aunque también podrían ser "No intrusivos" en todo caso xD el punto es que dejan el código relativamente limpio.

Al final no encuentro solución a mi problema.Pero es cuestión de investigar mejor creo yo. Muchas gracias por tu ayuda, espero poderte consultar cuando tenga dudas. ¿Podría agregarte de amigo en los contactos? asi te paso mi mail.

Repito lo agradecido que estoy de la atención prestada.
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.

Última edición por Dalvenjha; 14/01/2009 a las 08:34 Razón: Corrección =P
  #13 (permalink)  
Antiguo 14/01/2009, 08:47
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: problema con js this y settimeout

No hay problema en que me agregues a tu grupo de amigos, pero las dudas mejor cursarlas a través del foro
  #14 (permalink)  
Antiguo 14/01/2009, 09:47
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Una pregunta que es lo que quieres hacer con setTimeout?
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #15 (permalink)  
Antiguo 14/01/2009, 10:09
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Es una función recursiva, por lo tanto necesito hacer que la llamada se repita con algun delay entre repetición y repetición ya que si lo hiciera de otra manera, solamente cogería el valor mayor y el div simplemente "aparecería" de una manera dura. Lo que busco es que baje deslizandose. En la página que dejé hay un ejemplo pero es con uso de argumentos y asignandole un onclick a cada elemento de lista.

http://remsr.com/experimentos/index.html

Si ves, al apretar los elementos de la lista, se despliega unicamente uno de los divs independientemente de los otros. Y baja deslizandose.

Sorry si no sé explicarme.
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.
  #16 (permalink)  
Antiguo 14/01/2009, 10:30
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Ok ahora entiendo, mira el código que puso Panino5001 te funciona (tiene que usar algo así para usar recursion en js) solo que se ha creado un loop infinito. Resuelve esto al colocar el settimeout dentro del if pero no te funciona con los otros enlace ya que en ningún momento se borra tama. Coloca un else al if con tama=0

Suerte :)
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #17 (permalink)  
Antiguo 14/01/2009, 10:46
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

A ver!! lo probaré ahora mismo.

Acabo de probar lo que me dijiste, le puse un else, para que si el valor de "tama" iguala al de "tamara" tama se reinicialice a cero, la única pega que tiene es que debo hacer doble click para que regrese a cero. Sin embargo revisaré ahora como evitar eso.

Gracias otra vez!! no lo había notado.
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.

Última edición por Dalvenjha; 14/01/2009 a las 11:08
  #18 (permalink)  
Antiguo 15/01/2009, 08:59
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Parece que voy a tener que luchar un poco más, voy a completar la función para que se despliegue y regrese, entonces la podré presentar completa para su análisis.

Gracias!!
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.
  #19 (permalink)  
Antiguo 15/01/2009, 09:20
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Cita:
Iniciado por Dalvenjha Ver Mensaje
la única pega que tiene es que debo hacer doble click para que regrese a cero. Sin embargo revisaré ahora como evitar eso.

Gracias otra vez!! no lo había notado.
Que raro, no se si es que estas implementando otra cosa pero cada vez que yo le doy vuelve a cero y abre.
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #20 (permalink)  
Antiguo 15/01/2009, 09:32
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

A ver podrías poner el c{odigo que has implementado? uhmmm debe tener algo distinto con el mío.
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.
  #21 (permalink)  
Antiguo 15/01/2009, 09:43
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Asi fue como lo hice:

Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Pruebas</title>
<link rel="stylesheet" href="css/lib.css" type="text/css" />
<script type="text/javascript">
var tama = 0;
function despliegasema(e) {
	var tamer = this.title;
	var tamara = this.value;
	tama+=10;
	if(!(tama>=tamara)){
		document.getElementById(tamer).style.height = tama + 'px';
		var _this=this
		window.setTimeout(function(e){despliegasema.call(_this,e);},200);
	}else{tama = 0;}
}
window.onload = function(){
var listado = document.getElementById('lista').getElementsByTagName('li');
for(var i=1; i<listado.length; i++) {
   (function(){
    var _i=i;
      listado[i].onclick = function(e){despliegasema.call(listado[_i],e);}
     })()
    }
}
</script>

</head>
<body>
<div id="container">
<div id="lista">
<ul>
<li onclick="javascript:esconder();">esconder elementos de lista</li>
<li id="uno" title="desplegableuno" value="150" >despliega el primero</li>
<li title="desplegabledos" value="140" >despliega el segundo</li>
<li title="desplegabletres" value="160" >despliega el tercero</li>
<li title="desplegablecuatro" value="250" >despliega el cuarto</li>
<li title="desplegablecinco" value="100" >despliega el quinto</li>
<li title="desplegableseis" value="200" >despliega el sexto</li>
</ul>
</div>
<div id="listo">
<ul>
<li>no me borro</li>
<li>no me borro</li>
<li>no me borro</li>
</ul>
</div>
<div id="desplegableuno" >
<p>uno</p>
</div>
<div id="desplegabledos" >
<p>dos</p>
</div>
<div id="desplegabletres" >
<p>tres</p>
</div>
<div id="desplegablecuatro" >
<p>cuatro</p>
</div>
<div id="desplegablecinco" >
<p>cinco</p>
</div>
<div id="desplegableseis" >
<p>seis</p>
</div>
</div>
</body>
</html>
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
  #22 (permalink)  
Antiguo 15/01/2009, 10:16
Avatar de Dalvenjha  
Fecha de Ingreso: febrero-2008
Ubicación: $("#oficina");
Mensajes: 692
Antigüedad: 16 años, 2 meses
Puntos: 53
Respuesta: problema con js this y settimeout

Pues si, excelente, pero hay algo que no entiendo... :th cuando yo le puse el else, tenía que dar doble click. xD que raro.
__________________
Mi Showcase ||

Compartiendo todo lo posible con los demás.
  #23 (permalink)  
Antiguo 15/01/2009, 11:26
Avatar de sweetlydark  
Fecha de Ingreso: septiembre-2008
Mensajes: 391
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: problema con js this y settimeout

Cita:
Iniciado por Dalvenjha Ver Mensaje
Pues si, excelente, pero hay algo que no entiendo... :th cuando yo le puse el else, tenía que dar doble click. xD que raro.
en verdad que si.
__________________
Por fin vuelvo a tener internet!
http://www.anidandoetiquetas.com/
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 19:11.