Foros del Web » Programando para Internet » Javascript »

no me respeta el valor asignado

Estas en el tema de no me respeta el valor asignado en el foro de Javascript en Foros del Web. Que tal, estoy creando tablas dinamicamente y en una celda asigno una accion con parametro, esto es parte de lo que hago... Código HTML: objT=objTablas.responseXML; ...
  #1 (permalink)  
Antiguo 10/09/2007, 10:12
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
no me respeta el valor asignado

Que tal, estoy creando tablas dinamicamente y en una celda asigno una accion con parametro, esto es parte de lo que hago...

Código HTML:
objT=objTablas.responseXML; 
ListaT=objT.getElementsByTagName('tablas');
for(n=0; n < ListaT.length;n++){
var tbl     = document.createElement("table");
var tblBody = document.createElement("tbody");  
var rowPadre = document.createElement("tr");
var cveAct=ListaT[n].getElementsByTagName("cve_act")[0].firstChild.nodeValue.trim();//*********** aqui creo la variable ....
alert(cveAct);
for(m=0;m<conCampos;m++){
var cell = document.createElement("td");			
colr = "#ffffff";
cellText = document.createTextNode(ListaT[n].getElementsByTagName(consulta1[m])[0].firstChild.nodeValue.trim());
if(m==0)
     cell.onclick=function(){tablaHija(nivel,cveAct,conCampos,tblBody,tbl);};//aqui es donde se repite el ultimo valor extraido de la BD
cell.appendChild(cellText);
rowPadre.appendChild(cell);
}
tblBody.appendChild(rowPadre);
tbl.appendChild(tblBody);
divCampo.appendChild(tbl);
tbl.setAttribute("border", "0");
}
mi problema esta en la variable cveAct, como ven trato de mandarla como parametro pero siempre envia el ultimo valor obtenido de la BD, la variable cveAct contiene identificadores, por decir, si en mi query extraigo las clave a-001 , a-001 y a-003, en el onclick siempre me manda la a-003, no se por que, alguien puede ayudarme porfavor? se lo agradecere mucho!!!
__________________
Wow! No se que decir...
  #2 (permalink)  
Antiguo 10/09/2007, 15:38
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
Re: no me respeta el valor asignado

Hola zyon:

No se puede probar tu código, pero igual acierto con la respuesta.

Si pruebas ésto:
Código PHP:
<div id="contenedor">
    <
div>uno</div>
    <
div>dos</div>
    <
div>tres</div>
</
div>

<
script type="text/javascript">
<!--

// document.getElementById abreviado
function $(x) { return document.getElementById(x); }


var 
hijosDIV = $("contenedor").getElementsByTagName("DIV");
for( var 
i=0l=hijosDIV.lengthi<li++ ) {
    
hijosDIV[i].onclick = function() {
        
alert(i);
    }
}


// -->
</script> 
Verás que hagas click en la capa que hagas, siempre se alerta 3. Ésto es porque la variable i cuando se pide su valor dentro del onclick es 3.

Para que cada capa tenga su i tenemos que aislar el ámbito de i (o de una copia de i) para que no sea tan global. Es decir, que al modificar i no se modifique nuestra variable más encerrada:

Código PHP:
<div id="contenedor">
    <
div>uno</div>
    <
div>dos</div>
    <
div>tres</div>
</
div>

<
script type="text/javascript">
<!--

// document.getElementById abreviado
function $(x) { return document.getElementById(x); }


var 
hijosDIV = $("contenedor").getElementsByTagName("DIV");
for( var 
i=0l=hijosDIV.lengthi<li++ ) {
    ( function() {            
// cerramos (closure) para que aux tenga validez sólo aquí dentro, y no se pueda modificar desde fuera.
        
var aux i;
        
hijosDIV[i].onclick = function() {
            
alert(aux);
        }
    } ) ();
}


// -->
</script> 

Igual te parece rara la sintaxis. Dentro del for() aparece una function() auto-ejecutable que contiene una copia de i: aux. Ése aux sólo es modificable desde dentro de nuestra función anónima (o desde dentro de cada onclick). Lo bueno que tiene ésto, es que aux guarda lo que i valía en ese momento, y al modificar i no se modifica aux.


Más aquí: De closures y valores «inesperados»: el porqué y una solución


Si no es ése el error, me va a costar un poco más.

Un saludo.
__________________
- 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 11/09/2007, 07:22
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Re: no me respeta el valor asignado

Hola, muchas muchas gracias, esta genial ese código, aunque no entiendo bien como funciona, a que te refieres con eso de cerrar la funcion...pero me alivianaste muchisimo...le hechare un ojo a la liga que me diste pero ojala tu pudieras darme una pequeña explicación de por que no se modifica aux al modificar i si se le asigna nuevamente .... gracias de nuevo!
__________________
Wow! No se que decir...

Última edición por zyon; 11/09/2007 a las 08:02
  #4 (permalink)  
Antiguo 11/09/2007, 08:01
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
Re: no me respeta el valor asignado

Lo que ocurre en el primer código que has posteado es que la línea
var hijosDIV = $("contenedor").getElementsByTagName("DIV");
llama a "contenedor" antes de que se cree, por lo tanto todavia no existe, y da error. Hay que llamarlo con un window.onload o después de haber incrustado el elemento HTML en la página, como te lo puse yo


Pruébalo, ya verás como cada div tiene su valor, y no se alerta sólo el último. Ésto es porque la variable aux no es global, sólo pertenece al ámbito de la función anónima (y a todas las declaradas por debajo o dentro de esa función, véase el manejador de onclick de cada capa).

Tu código es más complicado, pero creo que lo que te he explicado va a ser difícil de aplicar en tu código... quizás viendo un ejemplo completo que podamos probar...

La variable cveAct no tengo muy claro de dónde sale y porque te toma valores inesperados..
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 11/09/2007, 08:05
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Re: no me respeta el valor asignado

up's ,me ganaste, ya entoiendo por que cuando implemente tu código no me funciono y ya entiendo por que no se altera la variable aux, quite mi mensaje anterior por que fue un error mio, no actualize una variable entonce spor eso no me funcionaba, pero como comente ariba, me funciono perfectamente, fue lo que necesitaba, gracias de nuevo derkenuke
__________________
Wow! No se que decir...
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 12:49.