Académique Documents
Professionnel Documents
Culture Documents
rbol de nodos
Una de las tareas habituales en la programacin de aplicaciones web con JavaScript
consiste en la manipulacin de las pginas web.
De esta forma, es habitual obtener el valor almacenado por algunos elementos (por
ejemplo los elementos de un formulario), crear un elemento (prrafos, <div>, etc.) de
forma dinmica y aadirlo a la pgina, aplicar una animacin a un elemento (que
aparezca/desaparezca, que se desplace, etc.).
Todas estas tareas habituales son muy sencillas de realizar gracias a DOM.
Sin embargo, para poder utilizar las utilidades de DOM, es necesario "transformar" la
pgina original.
Una pgina HTML normal no es ms que una sucesin de caracteres, por lo que es un
formato muy difcil de manipular. Por ello, los navegadores web transforman
automticamente todas las pginas web en una estructura ms eficiente de manipular.
Esta transformacin la realizan todos los navegadores de forma automtica y nos
permite utilizar las herramientas de DOM de forma muy sencilla.
<body>
Figura 1 rbol de nodos generado automticamente por DOM a partir del cdigo
XHTML de la pgina
En el esquema anterior, cada rectngulo representa un nodo DOM y las flechas indican
las relaciones entre nodos. Dentro de cada nodo, se ha incluido su tipo (que se ver
ms adelante) y su contenido.
La raz del rbol de nodos de cualquier pgina XHTML siempre es la misma: un nodo de
tipo especial denominado "Documento".
A partir de esta derivacin inicial, cada etiqueta XHTML se transforma en un nodo que
deriva del nodo correspondiente a su "etiqueta padre".
La transformacin de las etiquetas XHTML habituales genera dos nodos:
Figura 2 Nodos generados automticamente por DOM para una etiqueta XHTML
sencilla
De la misma forma, la siguiente etiqueta XHTML:
Figura 3 Nodos generados automticamente por DOM para una etiqueta XHTML con
otras etiquetas XHTML en su interior
La transformacin automtica de la pgina en un rbol de nodos siempre sigue las
mismas reglas:
Como se puede suponer, las pginas XHTML habituales producen rboles con miles de
nodos.
Tipos de nodos
Document, nodo raz del que derivan todos los dems nodos del rbol.
Element, representa cada una de las etiquetas XHTML. Se trata del nico nodo
Attr, se define un nodo de este tipo para representar cada uno de los atributos de
Text, nodo que contiene el texto encerrado por una etiqueta XHTML.
que puede contener atributos y el nico del que pueden derivar otros nodos.
las etiquetas XHTML, es decir, uno por cada par atributo=valor.
Los otros tipos de nodos existentes que no se van a considerar de momento son:
DocumentType
CDataSection
DocumentFragment
Entity
EntityReference
ProcessingInstruction
Notation.
Como acceder a un nodo del rbol es equivalente a acceder a "un trozo" de la pgina,
una vez construido el rbol, ya es posible manipular de forma sencilla la pgina:
acceder al valor de un elemento, establecer el valor de un elemento, mover un
elemento de la pgina, crear y aadir nuevos elementos, etc.
DOM proporciona dos mtodos alternativos para acceder a un nodo especfico: acceso
a travs de sus nodos padre y acceso directo.
Las funciones que proporciona DOM para acceder a un nodo a travs de sus nodos
padre consisten en acceder al nodo raz de la pgina y despus a sus nodos hijos y a los
nodos hijos de esos hijos y as sucesivamente hasta el ltimo nodo de la rama
terminada por el nodo buscado.
Sin embargo, cuando se quiere acceder a un nodo especfico, es mucho ms rpido
acceder directamente a ese nodo y no llegar hasta l descendiendo a travs de todos
sus nodos padre.
Por ese motivo, no se van a presentar las funciones necesarias para el acceso
jerrquico de nodos y se muestran solamente las que permiten acceder de forma
directa a los nodos.
getElementsByTagName()
El valor que se indica delante del nombre de la funcin (en este caso, document) es el
nodo a partir del cual se realiza la bsqueda de los elementos.
En este caso, como se quieren obtener todos los prrafos de la pgina, se utiliza el
valor document como punto de partida de la bsqueda.
El valor que devuelve la funcin es un array con todos los nodos que cumplen la
condicin de que su etiqueta coincide con el parmetro proporcionado.
Por lo tanto, se debe procesar cada valor del array de la forma que se muestra en las
siguientes secciones.
De la misma forma, se podran recorrer todos los prrafos de la pgina con el siguiente
cdigo:
for(var i=0; i<parrafos.length; i++) {
}
En el siguiente ejemplo, se obtienen todos los enlaces del primer prrafo de la pgina:
var parrafos = document.getElementsByTagName("p");
var primerParrafo = parrafos[0];
getElementsByName()
<p name="prueba">...</p>
<p name="especial">...</p>
<p>...</p>
Normalmente el atributo name es nico para los elementos HTML que lo definen, por
lo que es un mtodo muy prctico para acceder directamente al nodo deseado.
En el caso de los elementos HTML radiobutton, el atributo name es comn a todos
los radiobutton que estn relacionados, por lo que la funcin devuelve una coleccin
de elementos.
Internet Explorer no implementa de forma correcta esta funcin, ya que slo la tiene
en cuenta para los elementos de tipo <input> y <img>.
Adems, tambin tiene en consideracin los elementos cuyo atributo id sea igual al
parmetro de la funcin.
getElementById()
</div>
Acceder a los nodos y a sus propiedades (que se ver ms adelante) es slo una parte
de las manipulaciones habituales en las pginas.
Las otras operaciones habituales son las de crear y eliminar nodos del rbol DOM, es
decir, crear y eliminar "trozos" de la pgina web.
Como se ha visto, un elemento XHTML sencillo, como por ejemplo un prrafo, genera
dos nodos: el primer nodo es de tipo Element y representa la etiqueta <p> y el
segundo nodo es de tipo Text y representa el contenido textual de la etiqueta <p>.
Por este motivo, crear y aadir a la pgina un nuevo elemento XHTML sencillo consta
de cuatro pasos diferentes:
1. Creacin de un nodo de tipo Element que represente al elemento.
2. Creacin de un nodo de tipo Text que represente el contenido del elemento.
3. Aadir el nodo Text como nodo hijo del nodo Element.
4. Aadir el nodo Element a la pgina, en forma de nodo hijo del nodo
correspondiente al lugar en el que se quiere insertar el elemento.
De este modo, si se quiere aadir un prrafo simple al final de una pgina XHTML, es
necesario incluir el siguiente cdigo JavaScript:
// Crear nodo de tipo Element
El proceso de creacin de nuevos nodos puede llegar a ser tedioso, ya que implica la
utilizacin de tres funciones DOM:
debe utilizar al menos dos veces con los nodos habituales: en primer lugar se
aade el nodo Text como hijo del nodo Element y a continuacin se aade el
nodo Element como hijo de algn nodo de la pgina.
Eliminacin de nodos
Adems, esta funcin debe ser invocada desde el elemento padre de ese nodo que se
quiere eliminar. La forma ms segura y rpida de acceder al nodo padre de un
elemento es mediante la propiedad nodoHijo.parentNode.
As, para eliminar un nodo de una pgina XHTML se invoca a la
funcin removeChild() desde el valor parentNode del nodo que se quiere eliminar.
Una vez que se ha accedido a un nodo, el siguiente paso natural consiste en acceder
y/o modificar sus atributos y propiedades. Mediante DOM, es posible acceder de
forma sencilla a todos los atributos XHTML y todas las propiedades CSS de cualquier
elemento de la pgina.
Las propiedades CSS no son tan fciles de obtener como los atributos XHTML.
Para obtener el valor de cualquier propiedad CSS del nodo, se debe utilizar el
atributo style.
El siguiente ejemplo obtiene el valor de la propiedad margin de la imagen:
var imagen = document.getElementById("imagen");
alert(imagen.style.margin);
Figura 4 Valores que muestra Internet Explorer al acceder a las propiedades CSS a
travs de JavaScript
Figura 5 Valores que muestra Firefox al acceder a las propiedades CSS a travs de
JavaScript
Si el nombre de una propiedad CSS es compuesto, se accede a su valor modificando
ligeramente su nombre:
Como la palabra class est reservada por JavaScript, no es posible utilizarla para
acceder al atributo class del elemento XHTML.
En su lugar, DOM utiliza el nombre className para acceder al atributo class de XHTML:
var parrafo = document.getElementById("parrafo");
alert(parrafo.class); // muestra "undefined"