Foros del Web » Programando para Internet » Javascript »

Tabla dinámica y contenido de celda: No devuelve el dato

Estas en el tema de Tabla dinámica y contenido de celda: No devuelve el dato en el foro de Javascript en Foros del Web. Hola, soy nuevo y empiezo solicitando ayuda, pero no me enrollo y voy al grano: (El código lo he simplificado lo más que he podido) ...
  #1 (permalink)  
Antiguo 27/11/2012, 11:48
 
Fecha de Ingreso: noviembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Tabla dinámica y contenido de celda: No devuelve el dato

Hola, soy nuevo y empiezo solicitando ayuda, pero no me enrollo y voy al grano:
(El código lo he simplificado lo más que he podido)
Código HTML:
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="js.js"></script>
</head>
<body>
<table id="MiTabla" onload="crea_tabla()">
 <tbody></tbody>
 </table>
</body>
</html> 
Código Javascript:
Ver original
  1. function crea_tabla(){
  2.         var n=5;//filas
  3.         var n2=4;//columnas
  4.     var tblBody = document.getElementById("MiTabla").getElementsByTagName("tbody")[0];
  5.     for (var f=0;f<n;f++) {
  6.         var fila = document.createElement("tr");
  7.         for (var c=0;c<n2;c++) {
  8.             var celda = document.createElement("td");
  9.             var textoCelda;
  10.             textoCelda = document.createTextNode("Texto de ejemplo (en la versión final varía según la celda, en función de condiciones y demás)");
  11.                          //trozo problemático de código
  12.             celda.addEventListener("click",function(){celda_click(celda.textContent);},false);
  13.                         //resto de código  
  14.             celda.appendChild(textoCelda);
  15.             fila.appendChild(celda);
  16.         }
  17.         tblBody.appendChild(fila);
  18.     }  
  19. }
  20. function celda_click(str){
  21.     alert("Evento"+str);
  22. }

Creo una tabla dinámicamente e intento obtener su contenido al hacer click, creando un evento que llama a celda_click en cada celda.
El evento se lanza pero no consigo que se envíe como parámetro el contenido de la celda, el texto. Si hago:
Código Javascript:
Ver original
  1. celda.addEventListener("click",function(){celda_click("Texto de prueba");},false);
Puedo comprobar que el "Texto de prueba" sí se manda ya que al hacer click se muestra la alerta "EventoTexto de prueba".
Incluso si antes de crear el eventListener ejecuto un "alert(celda.textContent)" me muestra bien el dato, algo se me escapa ya que no entiendo por qué al hacer click no funciona.

Si alguién tiene algo que me pueda ayudar, aunque sea otra forma de hacer lo que busco... pues se lo agradezco
  #2 (permalink)  
Antiguo 27/11/2012, 12:25
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Tabla dinámica y contenido de celda: No devuelve el dato

Me pregunto como hiciste para verificar un evento agregado a un nodo que ni siquiera se genera.
mientras intentes crear la tabla desde un onload en la misma tabla , no se va a generar nada

<body onload="crea_tabla()">

en todo caso

__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 27/11/2012, 13:36
 
Fecha de Ingreso: noviembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tabla dinámica y contenido de celda: No devuelve el dato

Gracias por responder emprear. Pero el tema no es ese, el código que he puesto aquí está simplificado, en mi proyecto funciona bien y sí, está en el body onload, aunque no directamente.

La cuestión es que genero bien la tabla, y se crean eventos en cada celda, pero no logro que dicho evento obtenga el contenido de la celda.
  #4 (permalink)  
Antiguo 27/11/2012, 16:27
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Tabla dinámica y contenido de celda: No devuelve el dato

entonces sería oportuno que publiques el código sobre el cual se trabaja y no sobre el que no, que aqui no venimos (bueno, al menos yo) a perder el tiempo
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 28/11/2012, 07:19
 
Fecha de Ingreso: noviembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tabla dinámica y contenido de celda: No devuelve el dato

Tienes razón, pensé que reducir el código todo lo posible ayudaría a quien me quisiera ayudar, pero de esa forma no sucede todo tal como en el proyecto en desarrollo

Lo vuelvo a poner, ahora solo he omitido el CSS. El código... obviamente se trata de intentar hacer un calendario. Sé que hay por ahí para usar gratuitamente pero quiero hacerlo yo, aunque sea con ayuda

No descarto que el problema este en un fallo de concepto por mi parte

Yo el código lo pruebo con firefox 16.02. Como no es un proyecto profesional no tengo especial interés en la compatibilidad con todos los navegadores

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <head>
  3.         <meta http-equiv="refresh" content="50" />
  4.         <meta charset="UTF-8">
  5.         <title></title>
  6.         <script type="text/javascript" src="calendario.js"></script>
  7.     </head>
  8.     <body onload="body_load()">
  9.         <header>
  10.            
  11.         </header>
  12.         <div id="calendario">
  13.             <div id="calendario_alineacion">
  14.                 <table id="calendario_tabla">
  15.                     <thead>
  16.                         <tr>
  17.                             <th>Lunes</th>
  18.                             <th>Martes</th>
  19.                             <th>Mi&eacute;rcoles</th>
  20.                             <th>Jueves</th>
  21.                             <th>Viernes</th>
  22.                             <th>S&aacute;bado</th>
  23.                             <th>Domingo</th>
  24.                         </tr>
  25.                     </thead>
  26.                     <tbody>
  27.                     <tbody>
  28.                 </table>
  29.             </div>
  30.         </div>
  31.     </body>
  32. </html>

Código Javascript:
Ver original
  1. var fechaHoy = new Date();
  2. var fOp = new Date(); //fecha operativa
  3.  
  4. /**
  5.  * Devuelve el nº de días que tiene un mes.
  6.  */
  7. function dem(mes,anio) {
  8.     return new Date(anio, mes, 0).getDate();
  9. }
  10. /**
  11.  * Devuelve el primer día del mes en formato número.
  12.  * 0 = Lunes. 2=Martes.... 5=Sábado, 6=Domingo
  13.  */
  14. function pddm(mes,anio){
  15.     return (new Date(anio,mes).getDay() + 6)%7;
  16. }
  17. /**
  18.  * La tabla en si misma ya debe existir. Lo que hace
  19.  * esta función es añadir las filas y las columnas,
  20.  * calculando primero cuantas filas se requieren, pues
  21.  * habrá meses que necesiten más que otros.
  22.  * También escribe el contenido de las celdas, es decir,
  23.  * los días del mes en su posición correspondiente.
  24.  */
  25. function crea_tabla(){
  26.     //
  27.     var nfnec=6; //numero de filas necesarias (Falta calcularlos)
  28.     //
  29.     //crear las filas y las celdas dentro del tbody de la tabla e introducir dias
  30.     var cdias = 1; //contador de dias
  31.     var tblBody = document.getElementById("calendario_tabla").getElementsByTagName("tbody")[0];
  32.    
  33.     for (var f=0;f<nfnec;f++) {
  34.         var fila = document.createElement("tr");
  35.        
  36.         for (var c=0;c<7;c++) {
  37.             var celda = document.createElement("td");
  38.             var ind=true; //Habrá celdas vacías que no deben lanzar eventos
  39.             var textoCelda;
  40.             //estilo remarcado para el día de hoy
  41.             if (fechaHoy.getDate() == cdias) {
  42.                 celda.setAttribute("id","hoy");
  43.             }
  44.            
  45.             if (f==0) {
  46.                 if (c >= pddm(fOp.getMonth(),fOp.getFullYear())) {
  47.                     //se empiezan a escribir los días
  48.                     textoCelda = document.createTextNode(cdias);
  49.                     cdias++;
  50.                 } else {
  51.                     textoCelda = document.createTextNode(" ");
  52.                     ind=false;
  53.                 }
  54.             } else{
  55.                 if (f>0 && cdias<dem(fOp.getMonth(),fOp.getFullYear())) {
  56.                     textoCelda = document.createTextNode(cdias);
  57.                     cdias++;
  58.                 } else {
  59.                     textoCelda = document.createTextNode(" ");
  60.                     ind=false;
  61.                 }
  62.             }
  63.             celda.appendChild(textoCelda);
  64.             celda.setAttribute("class","calendario_celda");
  65.             fila.appendChild(celda);
  66.             if (ind) {             
  67.                 celda.addEventListener("click",function(){celda_click(celda.textContent);},false);
  68.             }
  69.         }
  70.         tblBody.appendChild(fila);
  71.     }  
  72. }
  73. function celda_click(str){
  74.     alert("Evento"+str);
  75. }
  76. function body_load(){
  77. crea_tabla();
  78. }

Y bueno, lo dicho, toda ayuda se agradece
  #6 (permalink)  
Antiguo 28/11/2012, 12:25
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: Tabla dinámica y contenido de celda: No devuelve el dato

buenas,
si bien cada celda ya tiene su handler (evento), el problema es la referencia a la celda dentro del handler.
Código:
 celda.addEventListener("click",function(){celda_click(celda.textContent);},false);
aquí celda siempre hace referencia al mismo elemento en todos los handlers. en este caso, al último elemento creado. puedes intentar cambiando celda por this para hacer referencia al propio elemento.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 28/11/2012, 13:12
 
Fecha de Ingreso: noviembre-2012
Mensajes: 4
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tabla dinámica y contenido de celda: No devuelve el dato

Cita:
Iniciado por zerokilled Ver Mensaje
buenas,
si bien cada celda ya tiene su handler (evento), el problema es la referencia a la celda dentro del handler.
Código:
 celda.addEventListener("click",function(){celda_click(celda.textContent);},false);
aquí celda siempre hace referencia al mismo elemento en todos los handlers. en este caso, al último elemento creado. puedes intentar cambiando celda por this para hacer referencia al propio elemento.
Gracias zero. Como en cada bucle creaba la variable celda pense que al crear el evento quedaría grabada la referencia especifica de esa iteración del bucle...
Cambiando "celda" por "this" como me has recomendado ha funcionado tal y como yo quería. Muchas gracias.

Etiquetas: celda, contenido, dato, devuelve, funcion, html, js, tabla
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 10:39.