Foros del Web » Programando para Internet » Javascript »

lastChild de un tr

Estas en el tema de lastChild de un tr en el foro de Javascript en Foros del Web. ¿Por qué el lastChild de un tr varía en función de cómo esté estructurado el HTML? A ver, en el siguiente ejemplo, el único alert ...
  #1 (permalink)  
Antiguo 27/07/2007, 14:58
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
lastChild de un tr

¿Por qué el lastChild de un tr varía en función de cómo esté estructurado el HTML?
A ver, en el siguiente ejemplo, el único alert que me viene con contenido es el tercero (celda 9)... los dos primeros alert's vienen vacíos!

Código:
function tabla(){
	var tabla = document.getElementById('mi_tabla');
	var filas = tabla.getElementsByTagName('tr');
	for(var i = 0; i < filas.length; i++){
		alert(filas[i].lastChild.textContent);
	}
	
}


<table id="mi_tabla">
<tr>
    <td>celda 1</td>
    <td>celda 2</td>
    <td>celda 3</td>
</tr>
<tr>
<td>celda 4</td>
<td>celda 5</td>
<td>celda 6</td>
</tr>
<tr><td>celda 7</td><td>celda 8</td><td>celda 9</td></tr>
</table>
Esto es normal? Cómo accedo al último hijo de cada <tr> sin importar cómo esté estructurado el código HTML?. O sea, quiero acceder a celda 3, celda 6 y celda 9

Gracias
  #2 (permalink)  
Antiguo 27/07/2007, 15:28
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Re: lastChild de un tr

De mientras lo hice así, pero no me parece bueno por dos motivos:

1- Tengo que usar 2 FOR para poder discriminar los TH y los TD
2- Y luego, para dar con el último elemento de cada TR, tengo que usar un FOR anidado.

Código:
function tabla(){
	var tabla = document.getElementById('mi_tabla');
	var filas = tabla.getElementsByTagName('tr');
	for(var i = 0; i < filas.length; i++){
		var encabezados = filas[i].getElementsByTagName('th');
		for(var j = 0; j < encabezados.length; j++){
			if(j == encabezados.length - 1){
				encabezados[j].style.display = 'none';
			}
		}
		var columnas = filas[i].getElementsByTagName('td');
		for(var j = 0; j < columnas.length; j++){
			if(j == columnas.length - 1){
				columnas[j].style.display = 'none';
			}
		}

	}
}
  #3 (permalink)  
Antiguo 27/07/2007, 17:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: lastChild de un tr

Varia por el texto jeje, los nodos de texto tmb te los regresa y en dado caso todos los lastChild son nodos de texto si haces un alert a el nodeType te va a decir que es de texto, jeje por eso en tu for debes de discriminar si el nodeType es 3 (textNode) y esta vacio debe de ser un espacio en blanco, tu buscas un nodeType 1 (un elemento en este caso un TD).

Saludos.
  #4 (permalink)  
Antiguo 27/07/2007, 17:52
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Re: lastChild de un tr

Hummm.. como que no te estoy entendiendo :nurotico

En el código del primer mensaje no hay, en ninguno de los 3 <tr>, "texto" entre el último <td> y el siguiente </tr> (por "texto" me refiero a algún espacio en blanco no-útil en el código fuente). Lo que si hay, en los dos primeros <tr>, es un salto de línea (¿eso es un "texto" también?)

De ser que no funciona por eso... ¿no la han "cagado" los que idearon esto? Digo: un espacio en blanco (o un salto de línea) allí no debería ser tomado en cuenta ya que no representa absolutamente nada... o al menos eso creo!
  #5 (permalink)  
Antiguo 27/07/2007, 21:12
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
Re: lastChild de un tr

Hola Dazu y GatorV:

El que implementa los espacios en blanco y los saltos de línea como nodos de texto es el archiconocido explorer (no tengo constancia de otro)... he trabajado en un destripador y un inspector DOM y los he probado con todos los navegadores y es en el único que tenía ese comportamiento... digo tenía porque parece que la versión 7 lo ha corregido ¿Lo has probado con otra versión...?

Sobre hacer 2 bucles... prueba en vez de getElementsByTagName con cells... y ya en cada celda si te interesa preguntar por su tagName.

Saludos

Edito de nuevo:

Hablando de cells (array de celdas) también existe el array de filas (rows)... tal vez eso te interese más.

__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 30/07/2007, 14:34
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Re: lastChild de un tr

Hola caricatos, lo he logrado gracias al array de filas y celdas que me propusiste usar y desconocía

Quedó más o menos así:

Código:
function tabla(){
	var tabla = document.getElementById('mi_tabla');
	var filas = tabla.rows;
	for(i = 0; i < filas.length; i++){
		la_celda = filas[i].cells[filas[i].cells.length - 1]
		if(la_celda.nodeName == 'TD'){
			alert('Esta celda es la última de la fila y no pertenece a un encabezado!!!');
		}
	}
}
En un rato sigo en otro tema al que llamaré por qué diablos no existe el insertAfter!!!

Saludos

Última edición por AlZuwaga; 30/07/2007 a las 15:12 Razón: para poner el enlace al tema creado
  #7 (permalink)  
Antiguo 30/07/2007, 14:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: lastChild de un tr

aa porque el insertAfter es para Prototype .

Saludos
  #8 (permalink)  
Antiguo 30/07/2007, 15:19
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Re: lastChild de un tr

Supongo que Prototype implementó una función propia llamada insertAfter que lo que debe hacer es valerse de métodos nativos para lograr el objetivo... ¿supuse bien?

Si así es, me gustaría implementarlo también en mi script sin valerme de librerías externas. Como para aprender, ¿vio?
  #9 (permalink)  
Antiguo 30/07/2007, 15:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: lastChild de un tr

Ah eso si, yo por eso siempre uso prototype, es una muy buena libreria de funciones .

Saludos.
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:38.