image
Inicio » Foros » JavaScript

JavaScript

obtener el valores de una tabla html

Volver al foro | Responder | Añadir nuevo tema


De: Luis Prieto
Fecha: 19/05/2007
Mensaje:

Hola, Amigos!! Quisiera saber como obtener los valores de una tabla html puedo saber cuantos elementos tiene, pero no puedo obtener los textos osea el hola, chau y adios del html que esta mas abajo, esta bien con innertext? o como seria. Y de poderse como se hace tambien en VBSCRIPT Por favor, envienmelo a mi correo [email protected] De antemano muchas gracias a todos. Saludos!! function listar() { var filas = document.getElementsByTagName('td') ; var total=filas.length; for(var i=0; i


Quiz�s le interese
De: jbosch(vosk)
Util para: 50 personas

Fecha: 19/05/2007
Mensaje:

primero, veo que te sucede (perdon, que me suced�a) lo mismo que a mi: ni saltos de linea, ni codigos enteros,... tal como dijo ZeroKilled una vez 'usa el ff'.

segundo, la instruccion 'innerText' solo es v�lida para msie; la forma estandar es 'innerHTML'. problema: te retorna el codigo html de lo que hay dentro del elemento, p.ej.

<html><head></head>
<body onLoad="alert(document.getElementById('a').innerHTML);">
<table><tr><td id="a"><b>hola</b></td></tr></table>
</body></html>

muestra '<b>hola</b>'. soluciones: o bien usas estilos css para eliminar las etiquetas html de formateo de texto, o echas mano a javascript para hacer lo siguiente

function A()
{
var t=document.getElementById('a');
var f=t.getElementsByTagName('td');
for(var q=0;q<f.length;++q)
{
alert(f[q].childNodes[0].innerHTML);
}
}

el punto importante es el de

childNodes[0]

prueba a hacer la misma llamada pero con la siguiente celda

<td><b><div>hola</div></b></td>

como ves encuentras que el resultado es ahora '<div>hola</div>', es decir que para corregirlo tendrias que resituarte en el primer nodo dentro del nodo '<b>' para estar en la etiqueta '<div>', y ademas si hay un <div> con un <b> y un <i> tendr�as que acceder al nodo de cada uno; para automatizarlo un poco puedes usar algo como esto

function A()
{
var t=document.getElementById('a');
var f=t.getElementsByTagName('td');
var n,p;
for(var q=0;q<f.length;++q)
{
n=f[q];
while(n)
{
p=n;
n=p.childNodes[0];
}
alert(p.parentNode.innerHTML);
}
}

supongo que te habras dado cuenta que aunque funciona hay algo que no cuadra: �porque dentro del bucle accedo a los childNodes y en el resultado final trabajo con el parentNode del ultimo childNode? bien, aqu� hay un peque�o problema que se me escapa: el ultimo childNode es un objeto 'undefined', pero como tal no puede compararse con el texto 'undefined' ni con el valor nulo (o al menos yo no soy capaz de hacerlo), es decir que el ultimo childNode no est� declarado pero no doy con la forma de omitirlo; por eso sabiendo que el ultimo childNode es nulo (t�cnicamente no es nulo porque si lo fuera no llevar�a el puntero a su elemento contenedor) doy como resultado el innerHTML del padre del ultimo childNode (vale, estoy de acuerdo en que es una solucion poco profesional).

a ver si alguin nos echa una mano con este ultimo punto.

jbosch(vosk)



De: ZeroKilled
Util para: 20 personas

Fecha: 19/05/2007
Mensaje:

buenas gentes!!....

vosk... hoy aprendi algo nuevo gracias a ti, de lo contrario estuviera aun sin saberlo. no sabia que la funcion getElementsByTagName la heredan los nodos. de primera pense que era una solucion incompatible que quisistes sacarle ventajas, luego busque en mi documentacion y evidentemente todos los nodos heredan tal funcion. muy interesante!

hablando sobre tu solucion al problema del compa�ero, verifica que tu codigo sea correcto, me parece que el id 'a' no va situado en la etiqueta td, por el contrario deberia ir en la tabla. si me equivoco corrigeme, pero a mi no me funciono tu codigo tal como lo has presentado. analizando tu codigo he concluido que la solucion no es muy fiable bajo ciertas circunstancias (me parece que ya lo sabias). imaginate que por alguna casualidad de la vida la celda contiene mas de una etiqueta html, resultara que el codigo solo buscara por la primera etiqueta que aparezca. un caso peor aun, que tal si el primer nodo es un TEXT_NODE vacio, por ejemplo

<td> <b>hola</b></td>

el DOM toma en consideracion el espacio que hay entre la etiqueta TD y la B. de modo que la etiqueta TD contiene 2 nodos y no uno, siendo el primero un TEXT_NODE y el segundo un B ELEMENT. realmente el contenido de ese primer nodo no es vacio sino que es un caracter no imprimible, en este caso el espacio. por otro lado, en mi opinion, ir nodo por nodo seria muy lento para obtener el resultado final. mi solucion es la siguiente: sabiendo que la propiedad innerHTML ademas de devolver el contenido tambien incluye el codigo fuente, que tal usar una expresion regular para limpiar todo lo que corresponde al codigo fuente. utilizando y modificando tu primera funcion seria algo como lo siguiente (fijate en la instruccion del alert):

function A()
{
var t=document.getElementById('a');
var f=t.getElementsByTagName('td');
for(var q=0;q<f.length;++q)
{
alert(f[q].innerHTML.replace(/<[^>]+>/g, ''));
}
}

quizas, lo que no seria conveniente de mi alternativa es que al eliminar todas las etiquetas el contenido pierda su formato acoplando cada texto de modo que el resultado final no se pueda entender.



De: jbosch(vosk)
Util para: 6 personas

Fecha: 19/05/2007
Mensaje:

ya sabia que responderias :)

tienes razon, el identificador 'a' tiene que estar en la tabla, solo que us� un ejemplo r�pido para el primer c�digo y luego no me acord� de colgar la tabla donde funciona el segundo script.

por lo dem�s tambien tienes toda la razon, no me hab�a fijado en que no funcionaba, de hecho hab�a planteado la situacion del '<b><div></div></b>' como excepcional sin darme cuenta que no tiene nada de raro. en cualquier caso la funcion que has colgado trabaja perfectamente y ademas pesa poco (importante). de todas formas he intentado corregir mi c�digo recorriendo todos los nodos, incluso con una funcion recursiva, pero desist� antes de terminar y ver tanto c�digo comparado con el uso de las regex. (demasiados fallos y descuidos en un solo dia, �tendr� algo que ver que ayer noche saliera a por tabaco y llegara pasadas las 5:00? :) ).

lo de las herencias de nodos: tal como yo lo entiendo, el 'getElementsByTagName' me retorna un puntero a una lista de objetos, y como tales tendran sus propios m�todos y valores con los que puedes trabajar a traves de ese puntero.

jbosch(vosk)




De: ZeroKilled
Util para: 13 personas

Fecha: 19/05/2007
Mensaje:

comprendo por lo que has pasado, eso me recuerda para cuando me fui 5 dias de viaje y cuando regrese me sentia como si todos mis conocimientos se me escaparan; no podia concentrarme y hasta se me olvidaban las funciones. y de por cierto, esa funcion recursiva que intentastes hacer, una vez yo lo hice y recuerdo que me tomo mucho tiempo, 5 o 7 dias en elaboracion y otros tantos dias mas en verificar que no tuviera errores. inclusive recuerdo que una vez hice publicacion de mi codigo en esta misma web pero eso lleva ya hace uno o dos a�os, creo que seguro tu la llegastes a ver. pudistes haber usado mi version para aplicarlo en este problema, pero de lo muy poco que yo te conozco se que tu prefieres crear tu propia version. y la verdad es que yo tambien hubiera hecho lo mismo :D (podria decirse que compartimos el mismo afan de crear nuestras propias versiones, por eso te entiendo)

por otra parte, el DOM define un modulo que se llama Traversal y de lo poco que llegue a leer este modulo trabaja con ese proposito, es una interfaz que define funciones que se encarga de recorrer todos los nodos desde un elemento indicado. sin embargo, ahora mismo desconozco que version de DOM implementa esta interfaz. pero en todo caso, yo intente en firefox y para mi sorpresa firefox no tiene el modulo. o al menos esa es mi conclusion.

sobre la funcion getElementsByTagName fue que yo pense que esa funcion la definia el objeto document, pues originalmente de ahi fue que yo conoci la funcion y desde siempre habia pensado que esa funcion solo trabaja en el document, no hasta cuando vi tu codigo.



Volver al foro | Responder | Añadir nuevo tema

Quiz�s le interese:

WebEstilo.com no se hace responsable de las opiniones que los usuarios puedan verter en cualquiera de los foros existentes.

Si te solucion� el problema pulsa en G+1


Gracias!






Comparte



Enlaces
Cocina Facil IngenieroSoftware.com  
Última modificación:05 de Agosto de 2012. Spain - Espa�a.
© 1998-2004 por . Todos los derechos reservados.